Я использую IB_DESIGNABLE в подклассе UIView, потому что хочу иметь возможность создавать атрибутивную строку программно, но отображать ее в построителе интерфейсов (избавляя меня от необходимости запускать приложение, чтобы увидеть форматирование)
Мне сказали, что я могу поместить свой код в
- (void)prepareForInterfaceBuilder;
И это работает до определенной степени. он появляется в конструкторе интерфейсов. Но когда я запускаю приложение, форматирование теряется. Он по-прежнему отображается в конструкторе интерфейсов, но не в приложении.
Ниже приведены методы, которые я пытался использовать для создания своей атрибутивной строки, но они не отображаются ни в построителе интерфейса, ни при запуске приложения.
- (instancetype)initWithFrame:(CGRect)frame;
- (void)drawRect:(CGRect)frame;
Однако с учетом сказанного я нашел метод, который будет отображаться в приложении, но не в построителе интерфейса.
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
С учетом сказанного, решением было бы просто использовать ОБА метода. Однако мне было интересно, есть ли другой метод, который взял бы лучшее из обоих миров.
Кроме того, я добавлю фрагмент кода, чтобы показать, что я делаю, и предложить некоторое завершение этого запроса.
IB_DESIGNABLE
@interface FooLabel1 : UILabel
@property (nonatomic, copy) IBInspectable NSAttributedString *attributedText;
@end
@implementation FooLabel1
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[self localizeattributedString];
}
return self;
}
- (void)localizeattributedString {
NSMutableAttributedString *mat = [[NSMutableAttributedString alloc] initWithString:NSLocalizedString(
@"Hello"
@"Darkness my old friend"
, nil) attributes:@{
NSForegroundColorAttributeName : [UIColor orangeColor],
}];
[mat appendAttributedString:[[NSAttributedString alloc] initWithString:NSLocalizedString(@"world!", nil) attributes:@{
NSFontAttributeName : [UIFont boldSystemFontOfSize:60],
NSForegroundColorAttributeName : [UIColor blueColor]
}]];
self.attributedText = [mat autorelease];
}
- (void)prepareForInterfaceBuilder {
[self localizeattributedString];
}
@end