IB_DESIGNABLE使用属性字符串

时间:2015-02-03 19:17:56

标签: objective-c ios8 interface-builder nsattributedstring ibdesignable

我在UIView子类上使用IB_DESIGNABLE,因为我希望能够以编程方式创建一个属性字符串,但是它出现在“界面”构建器中(使我不必运行应用程序来查看格式)

我被告知可以将我的代码放入

- (void)prepareForInterfaceBuilder;

它在某种程度上起作用。它出现在界面构建器中。但是当我去运行APP时,格式化就会丢失。它仍然出现在“界面”构建器中,但不会出现在应用程序中。

以下是我尝试用于创建Attributed String的方法,但它们不会出现在界面构建器中,也不会在应用程序运行时出现。

- (instancetype)initWithFrame:(CGRect)frame;
- (void)drawRect:(CGRect)frame;

然而,据说我找到了一个将在APP中呈现但不在界面构建器中呈现的方法。

- (instancetype)initWithCoder:(NSCoder *)aDecoder;

话虽如此,解决方案是使用BOTH方法。然而,我想知道是否有另一种方法可以充分利用这两个方面。

此外,我还会添加一个代码段来展示我正在做的事情并为此查询提供一些完成。

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

1 个答案:

答案 0 :(得分:0)

您问题中的解决方案正常,但出于错误的原因。您要做的是从localizeattributedStringinitWithCoder:调用您的配置方法(initWithFrame:),如下所示。

prepareForInterfaceBuilder是一种特殊方法,在呈现IB_DESIGNABLE视图的上下文中仅调用 。例如,如果通常自定义视图从Web服务获取其数据的一部分,则在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