@protocol UIAppearance :<NSObject>
该协议提供了可以一次性设定整个app中系统控件的外观的方法. 所以当我们需要自定义我们所用的控件的外观的时候就可以使用该方法来实例化对象
比如可以在UINavigationController的`+(void)initialize`中去设置`UINavigationBar`的背景图片:
`UINavigationBar *navBar = [UINavigationBar appearanceWhenContainedIn:self, nil];`
`[navBar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];`
这样在整个app中的系统的navBar的背景图片就都是该图片了!
感觉是在改变整个app中某些系统控件的外观上,这的确是一个很方便的方法
刚才用到的appearance方法是UIAppearance协议中的一个方法。根据官方文档的说法,它返回的是一个类的外观代理。可以通过给这个外观代理发送改变外观的消息,来达到自定义这个类的实例的外观的效果。
但是需要注意的是,使用外观代理改变控件的默认外观,只会对之后出现在窗口上的视图有效,但并不会改变之前就已经在窗口上的视图。
除了appearance方法,UIAppearance还有这些方法,来处理出现在特定容器中,或者是特定trait collection中的控件:
* + (instancetype)appearanceWhenContainedIn:(nullable Class)ContainerClass
* + (instancetype)appearanceForTraitCollection:(UITraitCollection *)trait
* + (instancetype)appearanceForTraitCollection:(UITraitCollection *)trait whenContainedIn:(nullable Class)ContainerClass
而在系统控件中,只有被`UI_APPEARANCE_SELECTOR`标签标记的方法,才支持使用外观代理来指定。
不过也可能有比较特殊的情况,试了一下,比如UILabel中的backgroundColor就不支持使用appearance方法设定