IB_DESIGNABLE с использованием строк с атрибутами

Я использую 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

person DerrickHo328    schedule 03.02.2015    source источник


Ответы (1)


Решение в вашем вопросе работает правильно, но по неправильным причинам. Что вам нужно сделать, так это вызвать метод конфигурации (localizeattributedString) как из initWithCoder:, так и из initWithFrame:, как показано ниже.

prepareForInterfaceBuilder – это специальный метод, который только вызывается в контексте рендеринга представления IB_DESIGNABLE. Например, если обычно пользовательское представление получает часть своих данных из веб-службы, в prepareForInterfaceBuilder вместо этого вы просто предоставите пример данных.

@implementation FooLabel1

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self localizeattributedString];
    }
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self localizeattributedString];
    }
    return self;
}

- (void)localizeattributedString {
    ...
}

@end
person Nate Cook    schedule 06.02.2015