【开发工具】UIButton:按钮高亮设置

UIButton高亮状态的效果,是通过设置高亮时的背景图片来设置的,没有设置高亮时按钮背景色的属性,这个分类就是实现设置按钮高亮和正常状态下背景色的功能

一,通过kvo监听按钮状态的变化,修改对应状态下的颜色

首先,想到的是监听 'UIButton' 的 'state' 属性

// 监听
[self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)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 *)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' 拖入按钮,设置按钮的背景颜色,会影响到文字的颜色,纯代码则不会

你可能感兴趣的:(【开发工具】UIButton:按钮高亮设置)