如何使UIAppearance代理适用于以编程方式创建的视图?

时间:2017-10-05 18:21:22

标签: ios swift uikit uilabel uiappearance

我正在尝试使用UIAppearance为我的应用创建主题。

说我希望我UILabel的所有文本都是橙色的。我写道:

UILabel.appearance(whenContainedInInstancesOf: [UIView.self]).textColor = .orange

但我意识到:

  • 这适用于通过Interface Builder创建的每个UILabel
  • 这不适用于以编程方式创建的任何UILabel。它们默认显示为黑色

我知道如何强制以编程方式创建的实例也是橙色的吗?

PS:我也尝试过:UILabel.appearance().textColor = .green这不是我想要的,但它也不起作用。

2 个答案:

答案 0 :(得分:0)

经过一番搜索......

显然,在Interface Builder 中创建的UI元素(如标签) .appearance()设置影响的事实并非真正有意,可能是不可靠。

事实上,文档似乎相当混乱和误导。

  

要支持外观自定义,类必须符合UIAppearanceContainer协议,并且必须使用UI_APPEARANCE_SELECTOR标记相关的访问器方法。

采用UIAppearance协议的唯一类是

  • UIBarItem
  • UIView

并且唯一采用UIAppearanceContainer协议的类是

  • UIPopoverController
  • UIPresentationController
  • UIView
  • UIViewController

所以......最好的选择可能是对你的标签进行细分。

答案 1 :(得分:0)

可在此处找到相关答案:How to default UILabel Font and Size using Swift

从该链接: " UIAppearance仅允许您在Objective-C头文件中设置使用UI_APPEARANCE_SELECTOR标记的属性。由于UILabel没有这样的属性,因此无法使用UIAppearance"

进行样式设置

也来自:https://developer.apple.com/documentation/uikit/uiappearance

" iOS在视图进入窗口时应用外观更改,它不会更改已在窗口中的视图的外观。要更改当前在窗口中的视图的外观,请从视图层次结构中删除该视图,然后将其放回。"

也可以从这里:trouble with UIAppearance and UIButton subclassing

"它以这种方式工作的原因是因为在将视图添加到视图层次结构时应用了外观属性,并且在将视图添加到视图层次结构之前应用了nib定义的属性。 "

我尝试在新类视图控制器的实例中设置标签的外观,然后以编程方式将该视图控制器添加到层次结构中,但没有运气。