有没有办法检查是否已在UIAppearance代理上设置了属性?
假设我想做类似的事情:
self.lineWidth = appearance.lineWidth ? : kDefaultLineWidth;
如果在代理上将lineWidth设置为零,则无法正常工作,因为它与根本没有设置无法区分(假设它是CGFloat)。
答案 0 :(得分:1)
你不应该做那个检查;外观系统将为您处理。在您的初始化工具中,使用直接ivar访问而不是其setter将lineWidth
设置为默认值:
_lineWidth = kDefaultLineWidth;
如果已为lineWidth
设置了外观属性,则会覆盖此属性。如果没有,它将不会被覆盖。
当您通过其setter 设置lineWidth
时,会出现问题。然后,外观系统会将该实例标记为已定制,并且不会覆盖您的更改。
来源:http://petersteinberger.com/blog/2013/uiappearance-for-custom-views/
一个问题是,UIAppearance会调动所有具有默认外观的设置器,并跟踪它们何时被更改,以便UIAppearance不会覆盖您的自定义设置。 [如果]我们在初始化程序中使用setter,...对于UIAppearance现在看起来好像我们已经自己定制了这个类。课程:仅在初始化程序中对符合UI_APPEARANCE_SELECTOR的属性使用直接ivar访问。