iOS中關於NavigationController中UIStatusBar黑白切換以及preferredStatusBarStyle一直不執行的問題
介紹
這效果簡直要了我的老命啊,在StackOverFlow上看遍了所有的回答,你們先感受下我的心情
這回答,試了下,不行啊
再來看看另一個,可以是可以,不過我要iOS 7以上的那個新方法啊
再換一個,沒錯,就是這個了,雖然票數少,但是就是你了
1.介紹第一種做法,比較簡單粗暴(但是貌似被iOS 9給廢掉了)
不過這種都不是問題,可以看一下Apple對已經廢棄的方法是如何處理的
還是介紹下 使用UIApplication的statusBarStyle方法來設定狀態列,不過,首先要停止使用View Controller - based status bar appearance。在project target的info plist中插入一個新的key,View controller-based status bar appearance,將其設定為NO
然後就可以用剛才能廢棄的方法進行修改了
我去啊,這什麼鬼啊,怎麼那麼白,白的都看不到了,各位將就下吧,差不多就這個效果了
2.介紹第二種做法,哎呦,這個厲害了啊,不過這真的搞死我了,先普及下呼叫方法的知識
給個老外的解釋,英文好的自己去看
給大夥分析下
- (UIStatusBarStyle)preferredStatusBarStyle
在需要的控制器裡面重寫這個方法,返回值就是UIStatusBarStyleDefault或者UIStatusBarStyleLightContent
在該方法裡面,如果只是簡單的返回值而已,那麼該介面在顯示的時候會立馬改變StatusBar的前景部分
如果該VC已經顯示出來了,你需要做的就是根據滾動的偏移量在實時更改StatusBar的前景顏色,那麼你就要用到
[self setNeedsStatusBarAppearanceUpdate]來顯視呼叫preferredStatusBarStyle這個方法才能更改StatusBar
的顏色
然而這個時候坑來了,你以為這樣設定好就完了麼,他就會呼叫了麼,你真的是too young too naive
最關鍵的東西來了
- (UIViewController *)childViewControllerForStatusBarStyle:
為什麼要重寫這個東西呢
這個方法預設返回值是nil。也就是當我們呼叫setNeedsStatusBarAppearanceUpdate的時候,系統會呼叫container(容器控制器)的
給UINavigationController寫一個Catogory,implementation如下,然後記得在需要的介面包含標頭檔案就行
該類擴充套件的意思就是,我重寫了,你不要呼叫Container(NavigationController或者UITabBarController)的preferredStatusBarStyle這個方法了,去呼叫self.visibleViewController的preferredStatusBarStyle,那麼,我們寫在UIViewcontroller裡面的方法就會被呼叫了,就能更改StatusBar的前景顏色了
總結:
只要UIViewController重寫的childViewControllerForStatusBarStyle返回值不是nil,那麼UIViewcontroller的preferredStatusBarStyle方法不會被系統的Container(NavigationController或者UITabBarController)呼叫,而是呼叫childViewControllerForStatusBarStyle返回的UIViewController的preferredStatusBarStyle來控制StatuBar的顏色
聽不明白沒關係,你遇到你就知道了,這真的有點坑
你以為這就完了麼???跑起來
這東西真的尷尬了我很久,我辛辛苦苦找了大半年的資料,竟然一點反應都沒有
最後試著把這貨改了
再跑起來
既然介紹了StatusBar的前景,稍微帶一下背景吧
navigationBar的setBarTintColor介面,可以用此介面可改變statusBar的背景色
但是有個方法需要注意的是:
一旦你呼叫了navigationBar的- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics介面,那麼上面的setBarTintColor介面就不能改變statusBar的背景色,statusBar的背景色就會變成純黑色
那麼咱們可以在UINavigationBar上addSubView,這個View就可以自己定義了,大小和原生的一樣就OK了
這東西折騰了我很久,拿出來記錄下,希望大家別被坑了