2017-10-05 45 views
0

我正在尝试使用UIAppearance来为我的应用程序创建主题。如何使UIAppearance代理适用于以编程方式创建的视图?

说我想我所有的UILabel的文本是橙色的。我写道:

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

但我意识到:

  • 这个工作对通过界面生成器中创建的每个UILabel
  • 这对编程创建的任何UILabel不起作用。它们默认显示为黑色

任何想法如何强制以编程方式创建实例为橙色?

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

+0

实际上'UILabel.appearance()。textColor'应该可以工作。你什么时候调用这个方法? –

回答

0

经过一番搜索...

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

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

为了支持外观定制,一个类必须符合UIAppearanceContainer协议,并且相关访问器方法必须标记为UI_APPEARANCE_SELECTOR。

即采用UIAppearance协议唯一的类是

  • UIBarItem
  • UIView

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

  • UIPopoverController
  • UIPresentationController
  • UIView
  • UIViewController

所以......最好的选择可能是子类的标签。

+0

令人失望的答案,但仍然是最好的。谢谢。 :) –

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

”删除视图,然后把它放回去。它的工作这样的原因是因为外观当视图添加到视图层次结构时应用属性,并且在将视图添加到视图层次结构之前应用了笔尖定义的属性。“

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