UIButton高亮状态的效果,是通过设置高亮时的背景图片来设置的,没有设置高亮时按钮背景色的属性,这个分类就是实现设置按钮高亮和正常状态下背景色的功能
一,通过kvo监听按钮状态的变化,修改对应状态下的颜色
首先,想到的是监听 'UIButton' 的 'state' 属性
// 监听
[self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ( [keyPath isEqualToString:@"state"]) {
[self setButtonBackgroundColor:(UIButton *)object];
}
}
发现并不能够监听到 'button.state' 的状态改变,但实际上是改变了的,在下面会验证
查看 'UIButton' 有 'highlighted' 这个属性
@property(nonatomic,getter=isHighlighted) BOOL highlighted; // default is NO.
监听 'highlighted' 属性
// 监听
[self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if (object == self && [keyPath isEqualToString:@"highlighted"]) {
[self setButtonBackgroundColor:(UIButton *)object];
}
}
- (void)setButtonBackgroundColor:(UIButton *)button{
if (button.state == UIControlStateNormal) {
if (self.ag_normalColor) {
button.backgroundColor = self.ag_normalColor;
}
}
else if (button.state == UIControlStateHighlighted) {
if (self.ag_highlightedColor) {
button.backgroundColor = self.ag_highlightedColor;
}
}
}
如果在 'setButtonBackgroundColor:' 通过断点观察,可以发现状态是改变了的,在这里修改背景色即可
demo地址:https://github.com/againxu/hightedButton-extension.git
二,绘制纯色的图片设置成背景图片
绘制图片
@interface UIImage (colorImage)
/** 绘制纯色图片 */
+ (UIImage *)ag_imageWithColor:(UIColor *)color;
@end
@implementation UIImage (colorImage)
+ (UIImage *)ag_imageWithColor:(UIColor *)color{
CGSize imageSize = CGSizeMake(50, 50);
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
UIBezierPath *p = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
[color setFill];
[p fill];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
设置按钮的背景图片即可
注意:
如果使用 'xib' 拖入按钮,设置按钮的背景颜色,会影响到文字的颜色,纯代码则不会