顏色
導(dǎo)航條的屬性 translucent 可以控制導(dǎo)航條是否是透明的, 默認(rèn)是YES,也就是透明的。打開時(shí)透過導(dǎo)航條可以模糊的看到ViewController或是Window的背景圖案。這里我們分為兩種情況來討論背景顏色的設(shè)置
在關(guān)閉translucent的情況下
可以通過 barTintColor 來設(shè)置導(dǎo)航條的背景色
當(dāng)然也可以通過 setBackgroundImage 來設(shè)置背景
但是backgroundImage的圖層更靠上一些,也就是說如果兩個(gè)都設(shè)置的話,顯示的是backgroundImage的圖片,不過如果你的圖片如果有透明的話,也會(huì)透出barTintColor的顏色
如果backgroundImage設(shè)置為純透明色,tintColor也設(shè)置為純透明色的話,這個(gè)時(shí)候?qū)Ш綏l是黑色的,這個(gè)時(shí)候不能透出window的背景色或是viewController的顏色,并且,此時(shí)設(shè)置bar的backgroundColor 是沒有用的
在開啟 translucent 的情況下
幾乎一樣,不過是在兩個(gè)圖層下面又可以透出Window或是viewController的背景色
如果backgroundImage設(shè)置為純透明色,tintColor也設(shè)置為純透明色的話,此時(shí)設(shè)置bar的backgroundColor 只會(huì)改變導(dǎo)航條的顏色,狀態(tài)欄則會(huì)透視下去,顯示的是viewController或是window的背景顏色
設(shè)置分割線的顏色需要使用 shadowImage 屬性,你可以賦予一張圖片,但是這個(gè)圖片只有在導(dǎo)航條背景使用 setBackgrounImage 設(shè)置的時(shí)候才能默認(rèn)啟用,否則是沒有用的
這里你可以這樣認(rèn)為,
backgroundImage在第一層,barTintColor在第二層,translucent是第三層(YES的時(shí)候是模糊透明,NO的時(shí)候是黑色不透明的),backgroundColor是第四層(但是只能顯示bar的44點(diǎn)高度的顏色,不能影響到status的顏色),通過層級(jí),你就可以自由的控制你想要的效果了。
顯示和隱藏
導(dǎo)航條的隱藏和顯示可以通過navigationBar.hidden控制
statusBar 顯示和隱藏
如果 View controller-based status bar appearance 為 NO, 我們就只能使用全局控制。就是使用 UIApplication.sharedApplication.statusBarHidden
來控制,但是這里蘋果已經(jīng)不推薦了,因?yàn)橐粋€(gè)地方的改動(dòng)會(huì)影響整個(gè)應(yīng)用
沒用使用導(dǎo)航管理控制器時(shí)
通過重寫方法-(BOOL)prefersStatusBarHidden來實(shí)現(xiàn)隱藏和顯示statusBar
通過重寫方法- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation 來控制狀態(tài)欄顯示動(dòng)畫
通過重寫方法- (UIStatusBarAnimation)preferredStatusBarStyle 來控制狀態(tài)欄樣式使用導(dǎo)航來管理控制器時(shí)
這個(gè)時(shí)候以上各個(gè)屬性并不會(huì)被調(diào)用,我們需要實(shí)現(xiàn)一個(gè)導(dǎo)航控制器的子類,然后在實(shí)現(xiàn)中覆寫方法
-(UIViewController )childViewControllerForStatusBarHidden
- (UIViewController )childViewControllerForStatusBarStyle
通過它返回你要控制的控制器就ok了,一般是返回self.topViewController**
可能遇見的問題
重寫的方法不執(zhí)行(實(shí)現(xiàn)了導(dǎo)航控制器子類后還是不執(zhí)行)
如果你從vcA使用present的方式跳轉(zhuǎn)到vcB,并且使用自定義動(dòng)畫(UIViewControllerAnimatedTransitioning),上述方法也是不會(huì)執(zhí)行的。解決方法是在vcB初始化的時(shí)候把 modalPresentationCapturesStatusBarAppearance設(shè)為 true。這個(gè)屬性決定vcB在非全屏模式下被present時(shí),是否接管statusBar外觀的控制權(quán),默認(rèn)為NO。因?yàn)樽远x動(dòng)畫屬于非全屏的跳轉(zhuǎn),所以跳轉(zhuǎn)以后的vc并沒有獲得statusBar外觀的控制權(quán),上面的方法就失效了,
push的時(shí)候?qū)Ш綏l會(huì)黑一下
一般是你實(shí)現(xiàn)一個(gè)導(dǎo)航控制器的子類,并用它push控制器的時(shí)候發(fā)生,可能是因?yàn)檗D(zhuǎn)場(chǎng)動(dòng)畫containerView的背景色的問題,你可以在導(dǎo)航控制器中設(shè)置自己的背景色是白色,就ok了
class ViewController: UIViewController {
var isHidden:Bool = false
@IBAction func clicked(sender: AnyObject) {
isHidden = !isHidden
UIView.animateWithDuration(0.5) { () -> Void in
self.setNeedsStatusBarAppearanceUpdate()
}
}
override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
return UIStatusBarAnimation.Slide
}
override func prefersStatusBarHidden() -> Bool {
return isHidden
}
}