未调用 tintColorDidChange

tintColorDidChange not called

我尝试实现我的 UIButton 类别,以便按钮实例可以具有预定义的属性,如边框颜色、边框角等。这是我设置按钮的代码我的类别的 .m 文件:

-(void)buttonForMe {
    [[self layer] setCornerRadius:2];
    [[self layer] setBorderColor:self.tintColor.CGColor];
    [[self layer] setBorderWidth:1];
}

正如您在第二行看到的那样,我将 borderColor 设置为 tintColor,这样当用户触摸按钮时,边框也会像文本一样淡化。 但是没有用。。我四处搜索 Tintcolor in custom border of UIButton 并按照答案进行搜索,但 它也没有用

-(void)tintColorDidChange {
    [super tintColorDidChange];
    [self setNeedsDisplay];
    NSLog(@"color changed");
}

我发现上面的方法从来没有被调用过,尽管我的按钮文本的颜色在我按下时确实发生了变化。只是不知道为什么那个方法从未被调用过?是因为我实现的是类别而不是 UIButton 的子类吗? 谢谢

用你的代码试试这个。

btnObj.clipsToBounds = YES;

我用KVO监控tintColor得到了nothing.So,我认为tintColorDidChange没有被调用的原因是点击时tintColor没有改变。 如果你想让你的层在点击时淡出,你可以创建UIButton的子类,然后使用KVO。

示例代码:

@implementation CustomButton
-(instancetype)init{
    if (self = [super init]) {
        [self setUp];
    }
    return self;
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder:aDecoder]) {
        [self setUp];
    }
    return self;
}
-(instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        [self setUp];
    }
    return self;
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    NSNumber * newValue = [change objectForKey:NSKeyValueChangeNewKey];
    if (newValue.boolValue) {
        self.layer.opacity = 0.3;
    }else
    {
        self.layer.opacity = 1.0;
    }
}

-(void)setUp{
    [[self layer] setCornerRadius:2];
    [[self layer] setBorderColor:self.tintColor.CGColor];
    [[self layer] setBorderWidth:1];
    [self addObserver:self forKeyPath:@"highlighted" options:NSKeyValueObservingOptionNew context:0];
}
-(void)dealloc{
    [self removeObserver:self forKeyPath:@"highlighted"];
}
@end

BTY:我不建议覆盖类别中的方法。

将色调颜色设置为相同的颜色不会导致调用 tintColorDidChange