本文參考自: http://www.cocoachina.com/ios/20150720/12671.html
歡迎參考
全局修改系統(tǒng)控件的顏色
例如:
可以通過 UIAppearance 來對控件進行全局外觀設(shè)置:
UIButton.appearance().tintColor = UIColor.magentaColor()
在 iOS9 中還新增了一個修改「局部外觀」的 API~
UIButton.appearanceWhenContainedInInstancesOfClasses([MyView.self]).tintColor = UIColor.cyanColor()
1. UIApearance是作用
UIApearance實際上是一個協(xié)議荆虱,我們可以用它來獲取一個類的外觀代理(appearance proxy)。為什么說是一個類壳鹤,而不明確說是一個視圖或控件呢荷腊?這是因為有些非視圖對象(如UIBarButtonItem)也可以實現(xiàn)這個協(xié)議,來定義其所包含的視圖對象的外觀崭参。我們可以給這個類的外觀代理發(fā)送一個修改消息请琳,來自定義一個類的實例的外觀稠通。
我們以系統(tǒng)定義的控件UIButton為例,根據(jù)我們的使用方式殖妇,可以通過UIAppearance修改整個應(yīng)用程序中所有UIButton的外觀刁笙,也可以修改某一特定容器類中所有UIButton的外觀(如UIBarButtonItem)。不過需要注意的是拉一,這種修改只會影響到那些執(zhí)行UIAppearance操作之后添加到我們的視圖層級架構(gòu)中的視圖或控件采盒,而不會影響到修改之前就已經(jīng)添加的對象。因此蔚润,如果要修改特定的視圖磅氨,先確保該視圖在使用UIAppearance后才通過addSubview添加到視圖層級架構(gòu)中。
2. UIApearance的使用
#第一種實現(xiàn)全局的方式:
+(instancetype)appearance
//實現(xiàn)全局設(shè)置的方法```
例如嫡纠,如果我們想修改UINavigationBar的所有實例的背影顏色和標(biāo)題外觀烦租,則可以如下實現(xiàn):
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()];
我們也可以指定一類容器,在這個容器中除盏,我們可以自定義一個類的所有實例的外觀叉橱。我們可以使用下面這個方法:
第二種實現(xiàn)全局的方式:
如,我們想修改導(dǎo)航欄中所有的按鈕的外面者蠕,則可以如下處理:
[[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中窃祝,又把這個方法給加上了,不過這回參數(shù)換成了數(shù)組踱侣,如下所示:
//oc版本
- (instancetype)appearanceWhenContainedInInstancesOfClasses:(NSArray<Class <UIAppearanceContainer>> *)containerTypes NS_AVAILABLE_IOS(9_0);
//swift版本
static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self