使用UIAppearance協議自定義視圖

iOS 5的重要補充功能:通過蘋果原生類庫自定義視圖外觀。在iOS 5以前,自定義原生控件的外觀並沒有原生支持,因此開發人員感覺很麻煩。開發人員經常面臨的問題是修改一個控件所有實例的外觀。解決這個問題的正確方法是重寫一遍控件。但由於這麼做非常費時,一些開發人員開始覆蓋或混寫一些方法,如drawRect:

從iOS 5開始,蘋果通過兩個協議(UIAppearanceUIAppearanceContainer)規範了對許多UIKit控件定製的支持。所有遵循UIAppearance協議的UI控件通過定製都可以呈現各種外觀。不僅如此,UIAppearance協議甚至允許開發者基於控件所屬的區域指定不同的外觀。也就是說,當某個控件包含在特定視圖中時,可以指定它的外觀(如UIBarButtonItemtintColor)。也可以獲取該控件類的外觀代理對象,用該代理定製外觀來實現,下面來看一個例子。

要定製應用中所有條形按鈕的顏色,可以在UIBarButtonItem的外觀代理中設置tintColor

[[UIBarButtonItem  appearance]  setTintColor:[UIColor  redColor]];

注意,iOS 4的時候setTintColor方法就在UIBarButtonItem中了,但它只會作用到某個特定的控件實例,而不是所有的此類控件。藉助外觀代理對象,我們可以定製使用上述類創建的任意對象的外觀。

同樣,可以根據內部包含的視圖採用如下方法來定製控件的外觀:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] 
setTintColor:[UIColor redColor]];

第一個參數是以nil結尾的所有容器類的列表,包括UINavigatorBarUIPopOverController等遵循UIAppearanceContainer協議的類。

從iOS 5開始,大多數UI元素都增加了對UIAppearance協議的支持。此外,iOS 5中類似於UISwitch的控件允許我們方便地將on開關的顏色變成設計師選定的顏色。現在,怎麼確定哪些情況下能夠通過UIKit的外觀代理來定製所有元素(以及元素中的哪些屬性)呢?有兩種方式。老辦法是查閱文檔,另一個辦法是大多數開發人員使用的快捷方式:讀頭文件。打開對應的UIKit元素的頭文件,其中所有帶有UI_APPEARANCE_SELECTOR標記的屬性都支持通過外觀代理來定製。舉個例子,UINavigationBar.h中的tintColor屬性帶有UI_APPEARANCE_SELECTOR標記:

@property(nonatomic,retain) UIColor      *tintColor    UI_APPEARANCE_SELECTOR;

意味着可以調用

[[UINavigationBar   appearance]  setTintColor:newColor];

儘管一開始蘋果反對(在Mac和iOS平臺上)使用UI定製,但情況慢慢發生了變化。蘋果自己的原生應用(比如新的Reminder應用)也有了深度定製的、模仿現實的用戶界面。有了UIAppearance協議,實現同樣效果所用的代碼要少得多。

發佈了6 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章