這是一個(gè)很常用的開(kāi)發(fā)場(chǎng)景,就是改變導(dǎo)航欄上的文字顏色與背景色案疲,如果你曾有 windows form 開(kāi)發(fā)經(jīng)驗(yàn)一定會(huì)笑我:“臥槽,這有什么好寫(xiě)的扛拨,不就是設(shè)置兩個(gè)屬性就可以了嗎?” 我以前也這樣認(rèn)為葱弟,但在iOS中這個(gè)過(guò)程是很落后的壹店,先來(lái)建立一個(gè)簡(jiǎn)單的帶有導(dǎo)航欄的項(xiàng)目,運(yùn)行效果是這樣的:
這個(gè)界面很不怎么樣芝加,至少很多情況下我們希望我們的APP在 導(dǎo)航欄上能顯示我們的主題色硅卢。
關(guān)于 UIColor
UIKit 的顏色類(lèi)(UIColor
)是很難用的,而且系統(tǒng)顏色也非常有限。鑒于此得先寫(xiě)個(gè)直接輸入16進(jìn)制數(shù)就能得到顏色實(shí)例的函數(shù)藏杖,代碼如下所示:
func uiColorFromHex(rgbValue:UInt32)-> UIColor {
let red = CGFloat((rgbValue & 0xFF0000) >> 16)/256.0
let green = CGFloat((rgbValue & 0xFF00) >> 8)/256.0
let blue = CGFloat(rgbValue & 0xFF)/256.0
return UIColor(red:red, green:green, blue:blue, alpha:1.0)
}
改變導(dǎo)航欄的顏色
如果要統(tǒng)一地修改所有的導(dǎo)航欄的顏色将塑,那么就要在 AppDelegate.swift
文件內(nèi)的 didFinishLauchingWithOptions
方法內(nèi)處理。如果每個(gè)視圖都有各自的顏色設(shè)定那么就得在每個(gè) ViewController 內(nèi)的 viewDidLoaded
方法實(shí)現(xiàn)了蝌麸。
AppDelegate.swift
的代碼如下:
let navigationBarAppearance = UINavigationBar.appearance()
navigationBarApparance.barTintColor = uiColorFromHex(0x007AFF)
navigationBarApparance.tintColor = uiColorFromHex(0xFFFFFF)
-
barTintColor
屬性是用于改變導(dǎo)航欄的背景色点寥。(臥槽!Apple 的命名果然還是一如既往的“好”啊来吩,用backgroundColor
就不用附加說(shuō)明了开财,真難以里解這個(gè)屬性被命名時(shí)這個(gè)程序員腦子是怎么想的汉柒。 ) -
tintColor
(另一個(gè)更讓人抓狂的屬性名)屬性控制:- 按鈕標(biāo)題
- 左/右按鈕圖型
此時(shí),你會(huì)發(fā)現(xiàn)導(dǎo)航欄中的文字仍然默認(rèn)的黑色责鳍,如果我們想這個(gè)文字也能變成白色那么并不是粗暴直接設(shè)置文字顏色碾褂,當(dāng)然如果要這么做的話可以設(shè)置 navigationBarAppearance.titleTextAttributes
屬性實(shí)現(xiàn)。但另一個(gè)更好的辦法是更改導(dǎo)航欄的樣式:
navigationBarApparance.barStyle = UIBarStyle.Black
這個(gè) UIBarStyle.Black
的原文解釋是這樣的:
Use a black background with light content.
好吧历葛,我們可以直接理解為將背景透明化吧正塌。(這種文檔實(shí)在是糟透了)
Anyway 至少現(xiàn)在已經(jīng)接近我們所需要的效果了。
剩下來(lái)就是上方那個(gè)占高24pt 狀態(tài)欄顏色還是默認(rèn)的黑色恤溶, 我們還得將它給換過(guò)來(lái)乓诽。被前面的代碼給折磨過(guò)后,思路上就是一樣的 “l(fā)ight content”
我們就在設(shè)置導(dǎo)航欄后加入以下的代碼:
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
最后還得做點(diǎn)點(diǎn)小修改咒程,用源代碼編輯器打開(kāi) Info.plist 文件鸠天,然后加入以下的代碼
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
禁止掉使用默認(rèn)的狀態(tài)欄樣式。
好了帐姻,這就是我們所需要的最終效果稠集。
為了大家方便閱讀,我將整個(gè)方法的代碼也貼出來(lái):
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let navigationBarApparance = UINavigationBar.appearance()
navigationBarApparance.barTintColor = uiColorFromHex(0x007AFF)
navigationBarApparance.tintColor = uiColorFromHex(0xFFFFFF)
navigationBarApparance.barStyle = UIBarStyle.Black
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
return true
}