先科普以下常识:简单来看,按钮有点击、非点击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是在松开手后才调用,具体效果大家可以自己试试。