Кнопка 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 ...: /