Переопределение UIButton setAttributedTitle:forState:

Я пытаюсь переопределить UIButton setAttributedTitle:forState: чтобы установить кернинг по умолчанию везде, где используется подкласс. Этот код создает правильный NSAttributedString и работает для любых UIB-кнопок, которые я создал с помощью Interface Builder:

- (void)setAttributedTitle:(NSAttributedString *)title forState:(UIControlState)state
{
    NSMutableAttributedString* attributeText = [[[NSAttributedString alloc] initWithAttributedString:title] mutableCopy];
    [attributeText addAttributes:@{NSKernAttributeName: @(kDefaultKerning)} range:[attributeText fullRange]];
    self.titleLabel.attributedText = attributeText;
    [self setNeedsDisplay];
}

Но это не работает ни для одного из подклассов UIButton, которые я создаю в коде:

[_myButton setAttributedTitle:attributedString forState:UIControlStateNormal];

Поэтому я попытался назвать супер вместо self.titleLabel.attributedText = attributeText;:

[super setAttributedTitle:title forState:state];

Это работает для кнопки, созданной в коде, но теперь это не работает для кнопок Interface Builder.

Поскольку, насколько я знаю, Interface Builder в любом случае просто вызывает setAttributedText, что дает? Как я могу заставить это переопределение работать как для сгенерированных кодом кнопок, так и для Interface Builder?

1 ответ

Решение

Дурак я. Конечно [super setAttributedTitle:title forState:state]; не работал, потому что я устанавливал его title вместо attributedText,

Решение:

- (void)setAttributedTitle:(NSAttributedString *)title forState:(UIControlState)state
{
    NSMutableAttributedString* attributeText = [[[NSAttributedString alloc] initWithAttributedString:title] mutableCopy];
    [attributeText addAttributes:@{NSKernAttributeName: @(kDefaultKerning)} range:[attributeText fullRange]];
    [super setAttributedTitle:attributeText forState:state];
    [self setNeedsDisplay];
}
Другие вопросы по тегам