自定义系统控件外观: UIAppearance的使用
本文参考自: http://www.cocoachina.com/ios/20150720/12671.html
欢迎参考
全局修改系统控件的颜色
例如:
可以通过 UIAppearance 来对控件进行全局外观设置:
UIButton.appearance().tintColor = UIColor.magentaColor()
在 iOS9 中还新增了一个修改「局部外观」的 API~
UIButton.appearanceWhenContainedInInstancesOfClasses([MyView.self]).tintColor = UIColor.cyanColor()
1. UIApearance是作用
UIApearance实际上是一个协议,我们可以用它来获取一个类的外观代理(appearance proxy)。为什么说是一个类,而不明确说是一个视图或控件呢?这是因为有些非视图对象(如UIBarButtonItem)也可以实现这个协议,来定义其所包含的视图对象的外观。我们可以给这个类的外观代理发送一个修改消息,来自定义一个类的实例的外观。
我们以系统定义的控件UIButton为例,根据我们的使用方式,可以通过UIAppearance修改整个应用程序中所有UIButton的外观,也可以修改某一特定容器类中所有UIButton的外观(如UIBarButtonItem)。不过需要注意的是,这种修改只会影响到那些执行UIAppearance操作之后添加到我们的视图层级架构中的视图或控件,而不会影响到修改之前就已经添加的对象。因此,如果要修改特定的视图,先确保该视图在使用UIAppearance后才通过addSubview添加到视图层级架构中。
2. UIApearance的使用
#第一种实现全局的方式:
+(instancetype)appearance
//实现全局设置的方法```
例如,如果我们想修改UINavigationBar的所有实例的背影颜色和标题外观,则可以如下实现:
UINavigationBar.appearance().barTintColor=UIColor(red:104.0/255.0,green:224.0/255.0,blue:231.0/255.0,alpha:1.0);
UINavigationBar.appearance().titleTextAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(15.0),NSForegroundColorAttributeName:UIColor.whiteColor()];
我们也可以指定一类容器,在这个容器中,我们可以自定义一个类的所有实例的外观。我们可以使用下面这个方法:
第二种实现全局的方式:
如,我们想修改导航栏中所有的按钮的外面,则可以如下处理:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setBackgroundImage:myNavBarButtonBackgroundImage forState:state barMetrics:metrics];
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], [UIPopoverController class], nil] setBackgroundImage:myPopoverNavBarButtonBackgroundImage forState:state barMetrics:metrics];
[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setBackgroundImage:myToolbarButtonBackgroundImage forState:state barMetrics:metrics];
[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], [UIPopoverController class], nil] setBackgroundImage:myPopoverToolbarButtonBackgroundImage forState:state barMetrics:metrics];
不过在iOS 9的SDK中,又把这个方法给加上了,不过这回参数换成了数组,如下所示:
//oc版本
- (instancetype)appearanceWhenContainedInInstancesOfClasses:(NSArray<Class <UIAppearanceContainer>> *)containerTypes NS_AVAILABLE_IOS(9_0);
//swift版本
static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self