UIButton作為最常用的控件之一,其繼承了父類UIView的屬性和方法,同時由于其繼承了UIControl使其與UIView區(qū)別開來,可以接收touch事件。
UIButton常用方法
1)UIButton的創(chuàng)建
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
button.titleLabel.text = @"button";
button.backgroundColor = [UIColor redColor];
[self.view addSubview:button];
效果如下圖,可以看到button的title并沒有顯示出來,why?

于是默默的打印了button...
<UIButtonLabel: 0x7fccf9725290; frame = (0 0; 0 0);
text = 'button'; hidden = YES; opaque = NO; userInteractionEnabled = NO;
layer = <_UILabelLayer: 0x7fccf97258e0>>
可以看到直接用點語法設置title時button上的label frame為0,且hidden屬性為YES,title自然不能顯示,需要改用set方法進行設置。
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
[button setTitle:@"button" forState:UIControlStateNormal];
button.backgroundColor = [UIColor redColor];
[self.view addSubview:button];
效果如下圖,可以看到button的title顯示出來了。

此時button上的label為:
<UIButtonLabel: 0x7fc90243b660; frame = (50 50; 0 0);
text = 'button'; opaque = NO;
userInteractionEnabled = NO;
layer = <_UILabelLayer: 0x7fc90243bcb0>>
2)設置按鈕圖片
首先我嘗試了這樣的方法:
button.imageView.image = [UIImage imageNamed:@"minion"];
很遺憾,圖片并未顯示,于是很自然的改用set方法
[button setImage:[UIImage imageNamed:@"minion"] forState:UIControlStateNormal];
效果如下圖,button的圖片顯示出來了,而且圖片縮放到了button的大小。

3)設置按鈕圖片邊距
很多時候并不想圖片直接占滿整個button,而是希望在上下左右留出一定邊距。這需要用到imageEdgeInsets屬性:
button.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
效果如下圖,button圖片上左下右的邊距都設置成了10,當然如果是背景圖則無效。

4)button的幾個狀態(tài)
- UIControlStateNormal
正常狀態(tài),默認狀態(tài),既不是selected狀態(tài)也不是高亮狀態(tài)的一種狀態(tài)。 - UIControlStateHighlighted
高亮狀態(tài),即按鈕被點擊且手還未離開按鈕的一個狀態(tài)。 - UIControlStateSelected
選中狀態(tài),不是字面上理解的按鈕被點擊選中,而是一種通過過改變其selected屬性來改變的一種狀態(tài)。 - UIControlStateDisabled
不可用狀態(tài),即按鈕此時處于灰色不能響應點擊的狀態(tài)。
我們時常有這樣一個需求:當點擊某個按鈕時改變其顯示的圖片,當再點擊時又變回原來的圖片。這就可以通過改變按鈕的正常狀態(tài)和選中狀態(tài)切換來實現(xiàn)。
- (void)viewDidLoad {
[super viewDidLoad];
[self.btn setImage:[UIImage imageNamed:@"duck"] forState:UIControlStateNormal];
[self.btn setImage:[UIImage imageNamed:@"pinguin"] forState:UIControlStateSelected];
}
- (IBAction)click:(UIButton *)sender {
sender.selected = !sender.selected;
}

從上面的動圖可以看到每次點擊,圖片切換了,但是當點擊按鈕且離開按鈕前顯示了圖片默認的高亮狀態(tài)圖,感覺有些突兀,想直接切換不要顯示高亮狀態(tài)的圖片。有沒有什么方法可以使狀態(tài)切換由normal->highlighted->selected跳過highlighted變?yōu)閚ormal->selected呢?那就把正常狀態(tài)到高亮設置成一樣,把選中狀態(tài)到高亮狀態(tài)的圖片設置成一樣不就沒有突變了么。
- (void)viewDidLoad {
[super viewDidLoad];
[self.btn setImage:[UIImage imageNamed:@"duck"] forState:UIControlStateHighlighted];
[self.btn setImage:[UIImage imageNamed:@"duck"] forState:UIControlStateNormal];
[self.btn setImage:[UIImage imageNamed:@"pinguin"] forState:UIControlStateSelected];
//選中狀態(tài)下的高亮圖片
[self.btn setImage:[UIImage imageNamed:@"pinguin"] forState:UIControlStateSelected|UIControlStateHighlighted];
}

可以看到由normal->highlighted的高亮狀態(tài)還在,太惡心了,看來只有在子類重寫button的setHighted來屏蔽系統(tǒng)高亮方法了。其實最簡單做法是讓button的類型Type由System改為Custom。效果如下:狀態(tài)切換一點也不鬧心了,不過系統(tǒng)的東西都沒了,tintColor什么的都沒用了。

PS: I am xinghun who is on the road.