先科普以下常識:簡單來看,按鈕有點擊、非點擊2個狀態,點擊時系統會自動調用設置按鈕高亮狀態的方法(setHighlighted:);非點擊時視為正常狀態(normal)。我們可以根據需要給不同狀態設置不同背景圖片,蘋果官方對按鈕狀態細致划分為3種:高亮(highlighted)、選中(selected)、普通(normal),如果編寫代碼時調用了方法(setSelected:),按鈕會呈選中狀態(selected)。
3種按鈕狀態,蘋果官方命名為:
UIControlStateNorma(正常)、UIControlStateHighlighted(高亮)、UIControlStateSelected(選中)
接下來將2張按鈕背景圖片作為講解素材:
UIControlStateNorma 狀態選用灰色圖片TabBar
UIControlStateHighlighted 或 UIControlStateSelected 狀態選用金色圖片TabBarSel
再次強調下,按鈕點擊時,一定會調用系統方法(setHighlighted:),並顯示為事先設置的高亮狀態圖片,如果之前沒設置,默認顯示效果為在原圖片下加一層灰色。點擊后只要沒松開手,就會保持highlighted狀態,松開手恢復顯示normal狀態。
現在看如下代碼:
// 設置按鈕圖片背景
NSString *name = [NSString stringWithFormat:@"TabBar"];
[button setBackgroundImage:[UIImage imageNamed:name] forState:UIControlStateNormal];
NSString *selectedName = [NSString stringWithFormat:@"TabBarSel" ];
[button setBackgroundImage : [UIImage imageNamed: selectedName] forState : UIControlStateHighlighted];// 第a行
// 監聽按鈕點擊
[button addTarget:self action:@selector(buttonClick:) forControlEvents: UIControlEventTouchDown]; // 第e行
// 點擊按鈕調用方法
- (void)buttonClick:(UIButton *)button
{
button.selected = YES; // 第b行
}
// 設置高亮狀態方法
- (void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted]; // 第c行
}
// 設置選中狀態方法
- (void)setSelected:(BOOL)selected
{
[super setSelected:selected]; // 第d行
}
代碼講解:
貼出的代碼是精簡版,能傳達清楚意思即可。對a、b、c、d、e各行做不同程度的修改,運行后點擊按鈕會看到不同的效果。
- 注釋掉第b行,點擊按鈕不放,顯示高亮狀態金色圖片,松開恢復正常狀態的灰色圖片。這點容易理解。
- 注釋掉第b行,注釋掉第c行,點擊按鈕,按鈕無任何變化。因為[super setHighlighted:highlighted]是設置高亮狀態,注釋掉后,方法內並沒有做任何事,所以不變。
- 不做任何修改,點擊按鈕,按鈕在原圖片上加一層灰色。雖然調用了(setSelected:)方法,但因為沒設置selected狀態下背景圖片,所以看到的只是變高亮的效果。
- 將第a行的UIControlStateHighlighted改為 UIControlStateSelected,點擊時為原圖片加一層灰色的高亮,松開手轉換為選中狀態的金色圖片。如果想去掉高亮狀態,注釋掉第c行即可,點擊直接變金色圖片。
注意:如果把第e行UIControlEventTouchDown改成UIControlEventTouchUpInside,應用在上述4種情況時會顯示效果會有一點差別,原因估計就在UIControlEventTouchDown是點擊了就調用方法buttonClick:,而UIControlEventTouchUpInside是在松開手后才調用,具體效果大家可以自己試試。