2015-02-26 6 views
0

Я пытаюсь реализовать мою категорию UIButton, так что экземпляр кнопки может иметь предопределенные атрибуты, такие как цвет границы, граничный угол и т. Д. Вот мой код для настройки кнопки в .m файле моей категории:tintColorDidChange not called

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

Как вы можете видеть на моей 2-ой линии, я поставил BorderColor быть tintColor так, что когда пользователь нажмите кнопку, граница также исчезает, как текст. Но это не сработало.. Я ищу около Tintcolor in custom border of UIButton и следую ответу и он не сработал ни.

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

Я обнаружил, что вышеупомянутый метод никогда не назывался, хотя оттенок текста моей кнопки менялся всякий раз, когда я нажимал. Просто не знаю, почему этот метод никогда не назывался? Это потому, что я реализую Категорию, а не подкласс UIButton? Спасибо.

ответ

0

Я использовал КВО для контроля 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: Я не предлагаю, чтобы переопределить метод в категории.

+0

Большое спасибо. Оно работает. Все еще думал, что есть лучший способ, но этот ответ абсолютно прекрасен :) – user3126636

-1

попробуйте использовать этот код.

btnObj.clipsToBounds = YES; 
+0

Спасибо, человек, но это не сработало – user3126636

0

Настройка цвета оттенка того же цвета не вызовет вызванного tintColorDidChange.