在UI控件中UIButton是極其常用的一類控件,它的類對象創建與大多數UI控件使用實例方法init創建不同,通常使用類方法創建:
+ (id)buttonWithType:(UIButtonType)buttonType;
如果使用實例方法創建UIButton對象,如:
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 300, 100, 50)];
對象的創建是沒有任何問題的,但是當為這個button對象設置一個標題時,如:
[button setTitle:@"asd" forState:UIControlStateNormal];
但程序運行之後屏幕上是沒有任何顯示的,但這並不是程序有bug,只是當button使用實例方法創建時,標題文字的默認顏色是白色,在白色屏幕或無設置背景色的屏幕上自然是看不見的。而如果使用類方法創建UIButton對象,則需要輸入一個UIButtonType類型的參數,這是一個枚舉,具體如下:
typedef NS_ENUM(NSInteger, UIButtonType) {
UIButtonTypeCustom = 0, // 自定義類型,即無類型,當選擇這個參數市與使用類方法效果相同
UIButtonTypeSystem, // 標准類型,一般情況下地選擇,在iOS7.0版本開始使用
UIButtonTypeDetailDisclosure, //與標准類型相比多了一個藍色的information標志
UIButtonTypeInfoLight, //information的標志亮一點
UIButtonTypeInfoDark, //information的標志暗一點
UIButtonTypeContactAdd, //與標准類型相比多了一個加號標志
UIButtonTypeRoundedRect = UIButtonTypeSystem, // 不贊成使用,已被標准類型代替
};
除了UIButtonTypeCustom以外其他枚舉類型的默認顏色都是藍色,幾時在button上放置圖片,最初的現實效果也是藍色。
而自定義類型則可正確顯示圖片本來的顏色。此外,若同時為button設置圖片和文字,則圖片在左文字在右。
設置標題文字:- (void)setTitle:(NSString *)title forState:(UIControlState)state;
設置圖片:- (void)setImage:(UIImage *)image forState:(UIControlState)state;
作用是在狀態state下顯示字符串對象title,圖片image,其中如果要在不同狀態顯示不同圖片則需要圖片相同大小,否則會錯誤顯示。
其中UIControlState是枚舉類型,具體如下:
typedef NS_OPTIONS(NSUInteger, UIControlState) {
UIControlStateNormal = 0, //正常狀態
UIControlStateHighlighted = 1 << 0, // 高亮狀態,當button被點擊時會從正常狀態轉變為高亮狀態,松開時自動轉化為正常轉態
UIControlStateDisabled = 1 << 1, //不可用狀態,通過屬性enabled設置
UIControlStateSelected = 1 << 2, // 選中轉態,通過屬性selected設置
UIControlStateApplication = 0x00FF0000, // 當應用程序標志時
UIControlStateReserved = 0xFF000000 //為內部框架預留
};
常見的用法是:
[button setTitle:title1 forState:UIControlStateNormal];
[button setTitle:title2 forState:UIControlStateHighlighted];
這樣button的正常狀態顯示title1,按下時顯示title2,松開時顯示title1.
設置圖片同理。
設置背景圖片:- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state
與設置圖片不同,背景圖片顯示在文字下方,而不是左邊。
設置標題文字顏色:- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state
此方法只改變標題文字顏色,不影響圖片顏色,而屬性tintColor則同時影響標題文字和圖片的顏色,但不影響背景圖像顏色。另外,當UIButton創建時選擇UIButtonTypeCustom或使用實例方法創建時屬性tintColor無效。
設置響應事件:- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
意思是當controlEvents發生時target調用action方法,用OC的說法就是發送action消息給target對象。
其中controlEvents是枚舉類型,具體如下:
typedef NS_OPTIONS(NSUInteger, UIControlEvents) {
UIControlEventTouchDown = 1 << 0, // 按鈕按下事件
UIControlEventTouchDownRepeat = 1 << 1, // 雙擊或多次點擊事件
UIControlEventTouchDragInside = 1 << 2, //控件窗口內部拖動事件
UIControlEventTouchDragOutside = 1 << 3, //控件窗口外部拖動事件
UIControlEventTouchDragEnter = 1 << 4, //從控件窗口外部拖動進入內部事件
UIControlEventTouchDragExit = 1 << 5, //控件窗口外部拖動進入內部事件
UIControlEventTouchUpInside = 1 << 6, //控件窗口內部點擊抬起事件,發生在UIControlEventTouchDown事件之後
UIControlEventTouchUpOutside = 1 << 7, //控件窗口內部點擊窗口外部抬起事件
UIControlEventTouchCancel = 1 << 8, //所有點擊取消事件,如:太多手指,上鎖,或有電話進入
UIControlEventValueChanged = 1 << 12, // 控件值改變事件,多用於UISlider,UISegmentControl,UIPageControl
UIControlEventEditingDidBegin = 1 << 16, // UITextField開始編輯事件,即進入第一響應時
UIControlEventEditingChanged = 1 << 17, //UITextField中的文字改變時
UIControlEventEditingDidEnd = 1 << 18, //UITextField結束編輯時,即取消第一響應時
UIControlEventEditingDidEndOnExit = 1 << 19, // 點擊'return key'時,默認是換行鍵,會自動取消第一響應結束編輯
UIControlEventAllTouchEvents = 0x00000FFF, // 所有觸摸事件
UIControlEventAllEditingEvents = 0x000F0000, // 所有 UITextField編輯事件
UIControlEventApplicationReserved = 0x0F000000, // range available for application use
UIControlEventSystemReserved = 0xF0000000, // range reserved for internal framework use
UIControlEventAllEvents = 0xFFFFFFFF //所有事件
};
取消響應事件:- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
作用是取消當controlEvents發生時target對action的響應,即當事件發生時target不再觸發方法action,當然前提是之前已經添加了對這個事件的方法響應,其中參數均可設置為nil,表示任意、所有,即移除全部。