標籤:ios7 objective-c tintcolor app theme
譯自http://captechconsulting.com/blog/steven-beyers/ios-7-tutorial-series-tint-color-and-easy-app-theming
自從iOS7,UIView有了一個新的屬性tintColor,它是用來在視覺上說明螢幕上哪些控制項是活躍的或者有相關的活動。例如bar button items和tab bar items預設使用tintColor。如果一個view沒有顯示地指定tintColor,它將繼承父視圖的tintColor,因此在整個視圖階層中將有一個連鎖反應。最簡單的情況是你可以通過一行代碼來給整個APP指定一個顏色主題:
[[UIApplication sharedApplication] keyWindow].tintColor = [UIColor orangeColor];
因為UIWindow繼承自UIView,所以我們可以指定一個tintColor,然後應用內的所有子視圖將繼承這個顏色。為了證明tintColor對各種使用者介面元素的影響,接下來將舉一個tabbar應用的例子,第一個頁面有6個按鈕,每個按鈕會改變UIWindow的tintColor為一個顏色。第二個頁面將展示tintColor對不用介面元素的影響。左上方的red按鈕會設定UIView的tintColor,右上方的blue按鈕會設定UIButton自身和tabbar的tintColor。最後UISegmentedControl將控制整個蘋果表徵圖的外觀。當我們按下第一頁的按鈕的時候,UIButton的文本就會自動適應按鈕指定的顏色。相似的,tabbar上的表徵圖和文本也會適應新的顏色。
相似地,我們可以設定指定視圖的tintColor,假設一個有tabbar應用設定的UIWindow的tintColor為藍色,為了區分出tab和主介面,我們可以設定主介面的tintColor為紅色。iOS7之前實現要用很多行顏色設定的代碼,但是現在只需要簡單的一行代碼改變主視圖的tintColor來設定主視圖自身和它所有子視圖的顏色。
self.view.tintColor = [UIColor redColor];
設定按鈕的tintColor會改變按鈕上文本的顏色,但是不會改變按鈕兄弟視圖和父視圖的顏色。
myButton.tintColor = [UIColor blueColor];
iOS7還能夠在alert或者action sheet出現的時候去色或者“暗”著色。這向使用者表明這些控制項當前不可用。按下第二個頁面的步進控制項就會看到這個效果,如:
iOS7中UIImage添加了一個新的屬性renderingMode,可以和tintColor結合著使用,renderingMode有三個選項,第一個是UIImageRenderingModeAutomatic,正如字面的意思自動根據UIImage的使用情境和tintColor來填充顏色,例如UIImageView不會根據tintColor渲染UIImage,而UIBarButtonItem會根據tintColor自動填滿UIImage。第二個選項是UIImageRenderingModeAlwaysOriginal,UIImage總是會根據自身的顏色渲染映像。第三個是UIImageRenderingModeAlwaysTemplate,這個模式將會用tintColor渲染所有UIImage不透明的地方,也就是說設定為這個屬性的UIImage被當做了一個模板,如果你希望映像的哪些部分不用tintColor渲染的話,你需要把哪些部分設定成完全透明的。在例子中的第二個介面中的Segmented控制項展示了這個功能。
正如我們看到的,tintColor和renderingMode兩個屬性給了我們很用的功能,但是使用tintColor有幾件事情我們需要注意,第一是tintColor不支援UIAppearance。這是非常不幸的,因為如果支援的話,我們可能通過幾行代碼就會改變整個APP的顏色,例如我們想要每一個UIButton以一個特殊顏色凸現出來,我們不得不單獨的設定每一個按鈕的tintColor。第二當擷取一個UIView的tintColor的時候,總是返回一個有效顏色。這是因為如果視圖的tintColor是nil就會返回父視圖的tintColor。如果所有的視圖包括UIWindow的tintColor都是nil的話,UIWindow總會返回一個預設的值,這個值是RGB(0,122,255).第三如果你自訂了一個視圖並且用到了tintColor,你應該實現tintColorDidChange方法以便於我們可以在必要的時候更新視圖的渲染。
- (void)tintColorDidChange
這個方法的預設實現是執行標準的更新。例如你子類化了一個UIImageView並且image的renderingImage設定為UIImageRenderingModeAlwaysTemplate或者子類了UIButton,當tintColor更新的時候自動重繪。覆蓋這個方法的目的是為了當tintColor改變的時候自訂一些行為。例如我們可以子類一個UIView來根據使用者的選擇改變顏色主題。例子中的顏色主題是橘色和黑色兩個選項,當使用者選擇一個選項的時候,我們可以自訂UIView和設定tintColor為橙色,接下來可以設定子視圖的tintColor為黑色。在iOS6中也有tintColor屬性但是這個屬性是用於navigation bars、tab bars、toolbars、search bars和scope bar的北京顏色。在iOS7中我們要設定這些控制項的背景顏色我們應該使用barTintColor。
tintColor十分有用並且非常容易使用,通過這個屬性使用者就可以通過觀看視圖來判斷當前哪些控制項是活躍的並且有相關的活動。
Tint Color的理解和APP簡單的主題化