Кнопка UIB с IB_DESIGNABLE выдает предупреждение атрибута времени выполнения и не отображается в Интерфейсном Разработчике

Я использую Xcode 6.1 и уже использую IB_DESIGNABLE с IBInspectable для довольно многих проектов, но внезапно он просто больше не работает. Я создал подклассные кнопки, которые размещают изображение и заголовок вертикально по центру друг над другом и позволяют пользователю устанавливать ширину и цвет границы через IB с IBInspectable.

Следующее предупреждение регистрируется, и нет предварительного просмотра моего кода в drawRect:

warning: IB Designables: Ignoring user defined runtime attribute for key path "spacingBetweenLabelAndImage" on instance of "UIButton". Hit an exception when attempting to set its value: [<UIButton 0x7f9278591260> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key spacingBetweenLabelAndImage.

Тем не менее, во время выполнения он рендерит так, как я намеревался, и он также учитывает тот же пользовательский интервал, который я добавил через IB.

Вот код меню, который переупорядочивает кнопку и заголовок:

#import "HamburgerButton.h"

IB_DESIGNABLE
@interface HamburgerImageButton : HamburgerButton

@property IBInspectable CGFloat spacingBetweenLabelAndImage;

@end

Реализация:

#import "HamburgerImageButton.h"

@implementation HamburgerImageButton

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    CGSize imageSize = self.imageView.frame.size;
    CGSize titleSize = self.titleLabel.frame.size;

    // Move the label left and the image right by half the width
    CGFloat leftInset = titleSize.width / 2;
    CGFloat rightInset = imageSize.width / 2;

    CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2;

    CGFloat topInset = imageSize.height / 2 + halfSpacing;
    CGFloat bottomInset = titleSize.height / 2 + halfSpacing;

    UIEdgeInsets imageInsets = UIEdgeInsetsMake(-bottomInset, leftInset, bottomInset, -leftInset);
    UIEdgeInsets titleInsets = UIEdgeInsetsMake(topInset, -rightInset, -topInset, rightInset);
    self.imageEdgeInsets = imageInsets;
    self.titleEdgeInsets = titleInsets;
}

@end

Вы, наверное, заметили, что он наследует HamburgerButton. Эта основная кнопка гамбургера не имеет изображения, и она только рисует границу вокруг кнопки. Эта основная кнопка гамбургера имеет точно такую ​​же проблему: она не рисует свою границу в drawRect в IB и имеет тот же тип ошибок. Вот этот код для полноты картины:

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface HamburgerButton : UIButton

@property IBInspectable CGFloat borderWidth;
@property IBInspectable UIColor *borderColor;

@end

Реализация:

#import "HamburgerButton.h"
#import <QuartzCore/QuartzCore.h>

@implementation HamburgerButton

- (void)copyInspectables {
    self.layer.borderWidth = self.borderWidth;
    self.layer.borderColor = self.borderColor.CGColor;
}

- (void)drawRect:(CGRect)rect {
    [self copyInspectables];
}

@end

Я не очень понимаю, почему он просто выдает предупреждение и ничего больше. Я действительно не изменил то, что я сделал. Я проверил раскадровку, это iOS 7 и выше, предназначенная для запуска в Xcode 6 (последняя версия).

Он жалуется, что не может найти это значение в UIButton, и это немного странно, потому что я его подклассил.

Обновление: так что я изменил все вокруг, и это сработало. Теперь это снова исчезает, ничего не меняя. Я думаю, что есть ошибка в Xcode 6.1 ...: /

Ответы на вопрос(7)

Ваш ответ на вопрос