iOS 導(dǎo)航欄的控制

顏色

導(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
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近項(xiàng)目里有個(gè)需求和導(dǎo)航欄的樣式定制有關(guān),深入之后發(fā)現(xiàn)之前理解的一些概念有些模糊,剛好趁著這次機(jī)會(huì)全面整理了一下。...
    Kevin追夢(mèng)先生閱讀 568評(píng)論 0 0
  • 最近項(xiàng)目里有個(gè)需求和導(dǎo)航欄的樣式定制有關(guān),深入之后發(fā)現(xiàn)之前理解的一些概念有些模糊,剛好趁著這次機(jī)會(huì)全面整理了一下。...
    hi_xgb閱讀 5,192評(píng)論 4 39
  • 軍訓(xùn)他找個(gè)借口逃掉了。
    何青猊閱讀 139評(píng)論 0 0
  • 感冒發(fā)燒,頭疼腦熱是非常常見的一種疾病,幾乎沒有人沒得過感冒,有些體質(zhì)不好的人甚至一年要感冒幾次,再加上感冒不會(huì)引...
    青葉11閱讀 2,212評(píng)論 15 23
  • 當(dāng)已經(jīng)蒼顏白發(fā)的自己重新審視事物之際,卻沒有了當(dāng)年的那份狀態(tài);而此時(shí)的面容已然暗淡,這是時(shí)間微微一晃而留下的唯...
    在世界中心說閱讀 609評(píng)論 0 1

友情鏈接更多精彩內(nèi)容