一、UIButton的定義
兩種創建方法?? ? ? ?
1)常規的initWithFrame的方式
UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(100, 50, 100, 75)];
[btn1 setTitle:@"close" forState:UIControlStateNormal];
btn1.backgroundColor = [UIColor greenColor];//button的背景顏色
[btn1 setBackgroundImage:[UIImage imageNamed:@"1.png"] forState:UIControlStateNormal];//button的背景圖片
2)UIButton 的一個類方法(也可以說是靜態方法)buttonWithType?
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];//創建一個圓角矩形的按鈕btn2.frame = CGRectMake(200, 20, 50, 60);
btn2.backgroundColor = [UIColor blackColor];
[btn2 setTitle:@"clicke" forState:UIControlStateNormal];
[self.window addSubview:btn1];
[self.window addSubview:btn2];
創建一個自定義的按鈕
UIButton *button1=[UIButton buttonWithType:UIButtonTypeCustom];
能夠定義的button類型有以下6種
typedef enum {
? ? ? UIButtonTypeCustom = 0,? ? ? ? ? 自定義風格-無類型,按鈕的內容需要自定義:位置尺寸、背景色,等(如果沒有自定義這些可能會看不到
? ? ? UIButtonTypeRoundedRect,? ? ? ? 圓角矩形
? ? ? UIButtonTypeDetailDisclosure,? ? 藍色小箭頭按鈕,主要做詳細說明用
? ? ? UIButtonTypeInfoLight,? ? ? ? ? 亮色感嘆號
? ? ? UIButtonTypeInfoDark,? ? ? ? ? ? 暗色感嘆號
? ? ? UIButtonTypeContactAdd,? ? ? ? ? 十字加號按鈕
? ? } UIButtonType;
???????注意:按鈕創建好之后,按鈕的類型是不可以被修改的
知識點:Detail Disclosure/info Light/info Dark長一樣(iOS7以前不一樣,扁平化以后都一樣,殘留的東西)
二、設置frame
????//給定button在view上的位置?
?????button1.frame = CGRectMake(20, 20, 280, 20);
? ? [button setFrame:CGRectMake(20,20,50,50)];
????調整Button內部布局????
1,調整內部子控件布局應用場景
-按鈕文字在圖片下方
-按鈕文字在圖片上方
-按鈕文字在圖片左邊(默認是在右邊)
-等等; 根據需求調整布局內部子控件
2,實現步驟:
-自定義按鈕->創建一個繼承 UIButton 的子類(如:CDHButton)
-給自定義按鈕中的子控件重新布局(有兩種方法)
-方法一:要實現兩個對象方法
-(CGRect)titleRectForContentRect:(CGRect)contentRect{
? ? // 返回文字的frame?
}
-? (CGRect)imageRectForContentRect:(CGRect)contentRect{
? ? // 返回圖片的frame
}
-方法二:實現layoutSubViews方法
- (void)layoutSubviews{
? ? [super layoutSubviews];
? ? // 插入需要設置位置尺寸的語句,并返回frame
}
3,設置是否調整圖片的顯示亮度
設置屬性
// 設置在 Highlighted 狀態點擊時是否調整圖片顯示亮度
@property(nonatomic)? ? ? ? ? BOOL? ? ? ? adjustsImageWhenHighlighted;? ? // default is YES. if YES, image is drawn darker when highlighted(pressed)
// 設置在disabled狀態是否調整圖片顯示亮度
@property(nonatomic)? ? ? ? ? BOOL? ? ? ? adjustsImageWhenDisabled;? ? ? // default is YES. if YES, image is drawn lighter when disabled
/* ?在disabled要不要調整顯示的圖片,當disabled的時候也不改變背景色??*/
self.adjustsImageWhenDisabled = NO;
4,按鈕的內邊距
設置內邊距屬性
// 按鈕內的子控件(圖片和文字)的內邊距,
@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR; // default is UIEdgeInsetsZero
// 按鈕內的子控件(文字)的內邊距,
@property(nonatomic) UIEdgeInsets titleEdgeInsets; // default is UIEdgeInsetsZero
// 按鈕內的子控件(圖片)的內邊距,
@property(nonatomic) UIEdgeInsets imageEdgeInsets; // default is UIEdgeInsetsZero
例子:
// 設置按鈕內圖片和文字內邊距位置為(30,30),即是按鈕內圖片和文字一起右移30,下移30
self.btn.contentEdgeInsets = UIEdgeInsetsMake(30, 30, 0, 0);
// 設置按鈕內文字內邊距位置為(0,-30),即是按鈕內文字上移30
self.btn.titleEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);
// 設置按鈕內圖片內邊距位置為(0,-30),即是按鈕內圖片上移30
self.btn.imageEdgeInsets = UIEdgeInsetsMake(0, -30, 0, 0);
三、button背景色
????//button背景色
?????button1.backgroundColor = [UIColor clearColor];
? ? ? [button setBackgroundColor:[UIColor blueColor]];
四、設置button填充圖片和背景圖片
//設置button填充圖片和背景圖片
? ? [button1 setImage:[UIImage imageNamed:@"btng.png"] forState:UIControlStateNormal];
? ? [button setBackgroundImage:[UIImageimageNamed:@"btng.png"]forState:UIControlStateNormal];
五、設置button標題和標題顏色
//設置button標題和標題顏色
? ? [button1 setTitle:@"點擊" forState:UIControlStateNormal];
? ? [button setTitleColor:[UIColorredColor]forState:UIControlStateNormal];
? ? [button setTitleShadowColor:[UIColor grayColor] forState:UIControlStateNormal ]; //陰影
六、state狀態
forState:?這個參數的作用是定義按鈕的文字或圖片在何種狀態下才會顯現
以下是幾種狀態
enum {
? ? ? ? UIControlStateNormal? ? ? = 0,? ? ? ? 常規狀態顯現? ? ? ? ? ?
? ? ? ? UIControlStateHighlighted? = 1 << 0,? ? 高亮狀態顯現?
? ? ? ? UIControlStateDisabled? ? = 1 << 1,? ? 禁用的狀態才會顯現
? ? ? ? UIControlStateSelected? ? = 1 << 2,? ? 選中狀態? ? ? ? ? ?
? ? ? ? UIControlStateApplication? = 0x00FF0000, 當應用程序標志時? ? ? ? ?
? ? ? ? UIControlStateReserved? ? = 0xFF000000? 為內部框架預留,可以不管他? ? ? ? ? ?
? ? };
@property(nonatomic,getter=isEnabled)BOOL enabled; // default is YES. if NO, ignores touch events and subclasses may draw differently?
?@property(nonatomic,getter=isSelected)BOOL selected; // default is NO may be used by some subclasses or by application?
?@property(nonatomic,getter=isHighlighted)BOOL highlighted;
1. normal(普通狀態)
-默認情況(Default)
-對應的枚舉常量:UIControlStateNormal
-除開UIControlStateHighlighted、UIControlStateDisabled、UIControlStateSelected以外的其他情況,都是normal狀態
-這種狀態下的按鈕【可以】接收點擊事件
-如果前后連著設置按鈕同時處于多種狀態, 則表現出來的也是 normal 狀態, 除去如果有 設置為 enabled = NO; 則會進入UIControlStateDisabled狀態(包括顏色), 不能點擊
//下面兩種雜交在一起(就不是 normal 后面三種 ), 會顯示為 Normal 狀態的顏色,
//但是 設置了 Enabled == NO, 所以這里也是不能點擊的,
self.button.selected = YES;
self.button.enabled = NO;
2. highlighted(高亮狀態)
-對應的枚舉常量:UIControlStateHighlighted
-【當按住按鈕不松開】或者【highlighted = YES】時就能達到這種狀態
-這種狀態下的按鈕【可以】接收點擊事件
3.selected (選中狀態)
-對應的枚舉常量:?UIControlStateSelected
-【button.selected = YES】時就能達到這種狀態
-這種狀態下的按鈕【可以】接收點擊事件
4. disabled(失效狀態,不可用狀態)
-如果enabled屬性為NO,就是處于disable狀態,代表按鈕不可以被點擊
-對應的枚舉常量:UIControlStateDisabled
-【button.enabled = NO】時就能達到這種狀態
-這種狀態下的按鈕【無法】接收點擊事件
5. 讓按鈕無法點擊的2種方法
-button.enabled = NO;?
【會】進入UIControlStateDisabled狀態
-button.userInteractionEnabled = NO;?
【不會】進入UIControlStateDisabled狀態,繼續保持當前狀態
重寫按鈕的某個狀態屬性的 setter 方法和 getter 方法設置按鈕的狀態
-如: 重寫按鈕高亮get方法, 如果返回值是 yes , 則永遠返回的是高亮狀態, 如果返回值是 NO 則永遠返回的是非高亮
- (BOOL)isHighlighted{
? return NO;
}
-重寫按鈕高亮 set 方法, 如果沒有實現內部屬性賦值(屬性是父類定義的, 要調用父類的方法賦值), 則不會出現高亮狀態
?// ? 如果給內部屬性賦值為 Yes , 則會一直為 YES狀態, 如果賦值為 NO, 則一直未 NO 狀態
- (void)setHighlighted:(BOOL)highlighted{
? [super setHighlighted:highlighted];
}
七、設置按鈕按下是否顏色變深
/*
? ? * 默認情況下,當按鈕高亮的情況下,圖像的顏色會被畫深一點,如果這下面的這個屬性設置為no,那么可以去掉這個功能
? ? */? ??
button1.adjustsImageWhenHighlighted = NO;
/* 跟上面的情況一樣,默認情況下,當按鈕禁用的時候,圖像會被畫得深一點,設置NO可以取消設置 */?
?button1.adjustsImageWhenDisabled = NO;
八、設置按鈕按下會發光
/* 下面的這個屬性設置為yes的狀態下,按鈕按下會發光 */?
?button1.showsTouchWhenHighlighted = YES;
九、添加或刪除事件處理
/* 給button添加事件,事件有很多種
? ? 按下按鈕,并且手指離開屏幕的時候觸發這個事件,跟web中的click事件一樣。
? ? 觸發了這個事件以后,執行butClick:這個方法,addTarget:self 的意思是說,這個方法在本類中也可以傳入其他類的指針 ?*/ ? ?
//添加事件? ??
[button1 addTarget:self action:@selector(butClick:) forControlEvents:UIControlEventTouchUpInside];
?//刪除事件? ?
?[button1 removeTarget:nil action:nil forControlEvents:UIControlEventTouchUpInside];
?//顯示控件? ?
?[self.view addSubview:button1];
十、設置按鈕內部圖片間距和標題間距
UIEdgeInsets insets; // 設置按鈕內部圖片間距
insets.top = insets.bottom = insets.right = insets.left = 10;
bt.contentEdgeInsets = insets;
bt.titleEdgeInsets = insets; // 標題間距
十一、一些其他的按鈕設置
btn1.titleLabel.font = [UIFont fontWithName:@“test” size:18];//設置按鈕字體大小
[btn1 setTag:101] ;//設置tag值
btn1.layer.cornerRadius = 4.5;//設置圓角——四個圓角半徑
btn1.layer.borderWidth = 0.5;// 按鈕邊框寬度
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // 設置顏色空間為rgb,用于生成
ColorRefCGColorRef borderColorRef = CGColorCreate(colorSpace,(CGFloat[]){ 0, 0, 0, 1 }); // 新建一個紅色的ColorRef,用于設置邊框(四個數字分別是 r, g, b, alpha)btn1.layer.borderColor = borderColorRef;
十二、重寫繪制行為
你可以通過子類化按鈕來定制屬于你自己的按鈕類。在子類化的時候你可以重載下面這些方法,這些方法返回CGRect結構,指明了按鈕每一組成部分的邊界。
? ? ? ????????注意:不要直接調用這些方法, 這些方法是你寫給系統調用的。
backgroundRectForBounds //指定背景邊界?
contentRectForBounds // 指定內容邊界?
titleRectForContentRect // 指定文字標題邊界?
?imageRectForContentRect //指定按鈕圖像邊界
? ??????例:
- (CGRect)imageRectForContentRect:(CGRect)bounds{
? ? return CGRectMake(0.0, 0.0, 44, 44);
}
[btn1 addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];//添加點擊按鈕事件
-(void)btnPressed:(id)sender{?
? ? ? UIButton* btn = (UIButton*)sender;?
? ? ? //開始寫你自己的動作?
}
forControlEvents參數類型
typedef NS_OPTIONS(NSUInteger, UIControlEvents)
{
? ? UIControlEventTouchDown? ? ? ? ? ? ? ? = 1 <<? 0,? ? ? // 單點觸摸按下事件:用戶點觸屏幕,或者又有新手指落下的時候。? ??
????UIControlEventTouchDownRepeat? ? ? = 1 <<? 1,? ? ? // 多點觸摸按下事件,點觸計數大于1:用戶按下第二、三、或第四根手指的時候。? ??
????UIControlEventTouchDragInside? ? ? ? = 1 <<? 2,? ? ? // 當一次觸摸在控件窗口內拖動時。? ??
????UIControlEventTouchDragOutside? ? ? = 1 <<? 3,? ? ? // 當一次觸摸在控件窗口之外拖動時。? ??
????UIControlEventTouchDragEnter? ? ? ? ? = 1 <<? 4,? ? ? // 當一次觸摸從控件窗口之外拖動到內部時? ??
????UIControlEventTouchDragExit? ? ? ? ? ? = 1 <<? 5,? ? ? // 當一次觸摸從控件窗口內部拖動到外部時。? ??
????UIControlEventTouchUpInside? ? ? ? ? ? = 1 <<? 6,? ? ? // 所有在控件之內觸摸抬起事件? ??
????UIControlEventTouchUpOutside? ? ? ? ? = 1 <<? 7,? ? ? // 所有在控件之外觸摸抬起事件(點觸必須開始與控件內部才會發送通知)。? ??
????UIControlEventTouchCancel? ? ? ? ? ? ? ? = 1 <<? 8,? ? ? //所有觸摸取消事件,即一次觸摸因為放上了太多手指而被取消,或者被上鎖或者電話呼叫打斷。? ?
?????UIControlEventValueChanged? ? ? ? ? ? = 1 << 12,? ? // 當控件的值發生改變時,發送通知。用于滑塊、分段控件、以及其他取值的控件。你可以配置滑塊控件何時發送通知,在滑塊被放下時發送,或者在被拖動時發送。? ??
????UIControlEventEditingDidBegin? ? ? ? ? = 1 << 16,? ? // 當文本控件中開始編輯時發送通知? ??
????UIControlEventEditingChanged? ? ? ? ? = 1 << 17,? ? // 當文本控件中的文本被改變時發送通知。? ??
????UIControlEventEditingDidEnd? ? ? ? ? ? ? = 1 << 18,? ? // 當文本控件中編輯結束時發送通知。? ??
????UIControlEventEditingDidEndOnExit? ? = 1 << 19,? ? // 當文本控件內通過按下回車鍵(或等價行為)結束編輯時,發送通知。? ??
????UIControlEventAllTouchEvents? ? ? ? ? ? = 0x00000FFF,? // 通知所有觸摸事件。? ??
????UIControlEventAllEditingEvents? ? ? ? ? = 0x000F0000,? // 通知所有關于文本編輯的事件。? ??
????UIControlEventApplicationReserved? ? = 0x0F000000,? // range available for application use? ??
????UIControlEventSystemReserved? ? ? ? ? = 0xF0000000,? // range reserved for internal framework use? ??
????UIControlEventAllEvents? ? ? ? ? ? ? ? ? ? ? = 0xFFFFFFFF? // 通知所有事件
};
UIButton的常見屬性設置方法
- (void)setTitle:(NSString *)title forState:(UIControlState)state;//設置按鈕的文字
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state;//設置按鈕的文字顏色
- (void)setImage:(UIImage *)image forState:(UIControlState)state; //設置按鈕內部的小圖片
- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state;//設置按鈕的背景圖片
btn.titleLabel.font = [UIFont systemFontOfSize:13];//設置按鈕的文字字體(需要拿到按鈕內部的label來設置)
- (NSString *)titleForState:(UIControlState)state; //獲得按鈕的文字
- (UIColor *)titleColorForState:(UIControlState)state;//獲得按鈕的文字顏色
- (UIImage *)imageForState:(UIControlState)state;//獲得按鈕內部的小圖片
- (UIImage *)backgroundImageForState:(UIControlState)state;//獲得按鈕的背景圖片