在iOS 5之前,自定義原生控件的外觀並無原生支持,所以開發人員感受很麻煩。開發人員常常面臨的問題是修改一個控件全部實例的外觀。解決這個問題的正確方法是重寫一遍控件。但因爲這麼作很是費時,一些開發人員開始覆蓋或混寫一些方法,如drawRect:
。app
從iOS 5開始,蘋果經過兩個協議(UIAppearance
和UIAppearanceContainer
)規範了對許多UIKit控件定製的支持。全部遵循UIAppearance
協議的UI控件經過定製均可以呈現各類外觀。不只如此,UIAppearance
協議甚至容許開發者基於控件所屬的區域指定不一樣的外觀。也就是說,當某個控件包含在特定視圖中時,能夠指定它的外觀(如UIBarButtonItem
的tintColor
)。也能夠獲取該控件類的外觀代理對象,用該代理定製外觀來實現,下面來看一個例子。atom
要定製應用中全部條形按鈕的顏色,能夠在UIBarButtonItem
的外觀代理中設置tintColor
:spa
[[UIBarButtonItem appearance] setTintColor:[UIColor redColor]];
注意,iOS 4的時候setTintColor
方法就在UIBarButtonItem
中了,但它只會做用到某個特定的控件實例,而不是全部的此類控件。藉助外觀代理對象,咱們能夠定製使用上述類建立的任意對象的外觀。設計
一樣,能夠根據內部包含的視圖採用以下方法來定製控件的外觀:代理
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTintColor:[UIColor redColor]];
第一個參數是以nil
結尾的全部容器類的列表,包括UINavigatorBar
、UIPopOverController
等遵循UIAppearanceContainer
協議的類。code
從iOS 5開始,大多數UI元素都增長了對UIAppearance
協議的支持。此外,iOS 5中相似於UISwitch
的控件容許咱們方便地將on開關的顏色變成設計師選定的顏色。如今,怎麼肯定哪些狀況下可以經過UIKit的外觀代理來定製全部元素(以及元素中的哪些屬性)呢?有兩種方式。老辦法是查閱文檔,另外一個辦法是大多數開發人員使用的快捷方式:讀頭文件。打開對應的UIKit元素的頭文件,其中全部帶有UI_APPEARANCE_SELECTOR
標記的屬性都支持經過外觀代理來定製。舉個例子,UINavigationBar.h中的tintColor
屬性帶有UI_APPEARANCE_SELECTOR
標記:orm
@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR;
意味着能夠調用對象
[[UINavigationBar appearance] setTintColor:newColor];
儘管一開始蘋果反對(在Mac和iOS平臺上)使用UI定製,但狀況慢慢發生了變化。蘋果本身的原生應用(好比新的Reminder應用)也有了深度定製的、模仿現實的用戶界面。有了UIAppearance
協議,實現一樣效果所用的代碼要少得多。開發