1. 程式人生 > >iOS中關於NavigationController中UIStatusBar黑白切換以及preferredStatusBarStyle一直不執行的問題

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(容器控制器)的

preferredStatusBarStyle這個方法(app.window.rootViewController的preferred的方法,一般我們用UINavigationController或者UITabBarController來做container),也就是根本不會呼叫子控制器(我們所看到的UIViewcontroller)的preferredStatusBarStyle方法。這個時候- (UIViewController *)childViewControllerForStatusBarStyle:就派上用場了

給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的前景,稍微帶一下背景吧

navigationBarsetBarTintColor介面,可以用此介面可改變statusBar的背景色

但是有個方法需要注意的是:

一旦你呼叫了navigationBar- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics介面,那麼上面的setBarTintColor介面就不能改變statusBar的背景色,statusBar的背景色就會變成純黑色

那麼咱們可以在UINavigationBar上addSubView,這個View就可以自己定義了,大小和原生的一樣就OK了

這東西折騰了我很久,拿出來記錄下,希望大家別被坑了

Demo