UIAppearance不承担编程方式创建UILabels效果(UIAppearance not t

2019-07-30 05:34发布

我们已经扩展的UILabel能够应用标准字体和颜色在我们的应用程序给定的标签类型的所有用途。 例如。

@interface UILabelHeadingBold : UILabel
@end

在我们的AppDelegate中,我们应用的字体和颜色像这样

[[UILabelHeadingBold appearance] setTextColor:<some color>];
[[UILabelHeadingBold appearance] setFont:<some font>];

当添加在我们厦门国际银行的一个UILabel,我们现在可以选择类为类型UILabelHeadingBold的,它按预期工作。 标签显示与正确的字体和颜色,在我们的AppDelegate规定。

然而,如果我们以编程方式创建一个标签,例如。

UILabelHeadingBold *headingLabel = [[UILabelHeadingBold alloc] initWithFrame:CGRectMake(10, 10, 100, 30)];
[self.mainView addSubview:headingLabel];

该的UILabel没有得到应用的预期字体/颜色。 我们必须手动应用这些属性。

有没有一种方法,使UIAppearance采取编程方式创建UI元素的效果,或者在厦门国际银行的使用时,它才有效?

Answer 1:

从苹果的文档:

为了支持外观定制,类必须符合UIAppearanceContainer协议和相关的访问方法必须注明UI_APPEARANCE_SELECTOR。

例如,在UINavigationBar.htintColor标有UI_APPEARANCE_SELECTOR

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;

但在UILabel.h你可以看到textColorfont propertys都没有标明UI_APPEARANCE_SELECTOR但不知何故,(它不应该在所有的工作文档以下)的作品在Interface Builder添加时。



Answer 2:

这是为我工作没有问题简单的黑客是创建一个UIAppearance setter方法来修改的UILabel性质类别。

继UIAppearance约定我创建了一个方法:

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes;
{
    UIFont *font = [numberTextAttributes objectForKey:UITextAttributeFont];
    if (font) {
        self.font = font;
    }
    UIColor *textColor = [numberTextAttributes objectForKey:UITextAttributeTextColor];
    if (textColor) {
        self.textColor = textColor;
    }
    UIColor *textShadowColor = [numberTextAttributes objectForKey:UITextAttributeTextShadowColor];
    if (textShadowColor) {
        self.shadowColor = textShadowColor;
    }
    NSValue *shadowOffsetValue = [numberTextAttributes objectForKey:UITextAttributeTextShadowOffset];
    if (shadowOffsetValue) {
        UIOffset shadowOffset = [shadowOffsetValue UIOffsetValue];
        self.shadowOffset = CGSizeMake(shadowOffset.horizontal, shadowOffset.vertical);
    }
}

在类的UILabel:

@interface UILabel (UISS)

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes UI_APPEARANCE_SELECTOR;

@end

我还在试图找出原因,原来二传手不起作用。



Answer 3:

我在此完全相同的问题,但是在斯威夫特。 自定义UILabel如果从故事板加入,但如果从代码中添加的外观会工作。

这里有一个解决方案,我在这的工作对我来说斯威夫特发现:

class MyLabel: UILabel { }

extension UILabel {
    @objc dynamic var customFont: UIFont! {
        get { return self.font }
        set { self.font = newValue }
    }

    @objc dynamic var customColor: UIColor! {
        get { return self.textColor }
        set {  self.textColor = newValue }
    }
}

然后加入其中配置您的应用程序的外观这些行:

MyLabel.appearance().customFont = UIFont.systemFont(ofSize: 20)
MyLabel.appearance().customColor = UIColor.magenta


Answer 4:

@ robert.wijas解决方案的伟大工程!

对于iOS 7及以上我不得不更新,因为他使用的是过时的7+的一个关键:

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes;
{
    UIFont *font = [numberTextAttributes objectForKey:NSFontAttributeName];
    if (font) {
        self.font = font;
    }
    UIColor *textColor = [numberTextAttributes objectForKey:NSForegroundColorAttributeName];
    if (textColor) {
        self.textColor = textColor;
    }
    UIColor *textShadowColor = [numberTextAttributes objectForKey:NSShadowAttributeName];
    if (textShadowColor) {
        self.shadowColor = textShadowColor;
    }
    NSValue *shadowOffsetValue = [numberTextAttributes objectForKey:NSShadowAttributeName];
    if (shadowOffsetValue) {
        UIOffset shadowOffset = [shadowOffsetValue UIOffsetValue];
        self.shadowOffset = CGSizeMake(shadowOffset.horizontal, shadowOffset.vertical);
    }
}


Answer 5:

我所使用的解决方法是从所设定的外观手动应用颜色:

let label = UILabel()
label.textColor = UILabel.appearance().textColor

这样,您就不需要引用任何新的东西,或明确定义的颜色。 这也适用于特定的上下文着色:

label.textColor = UILabel.appearance(whenContainedInInstancesOf:[MyView.self]).textColor


文章来源: UIAppearance not taking effect on UILabels created programmatically