Я запускаю 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...:/