1. 程式人生 > >一篇搞定狀態列顏色變化

一篇搞定狀態列顏色變化

近日,在公司專案開發要實現狀態列顏色及時更改的效果時,總感覺有點迷糊,現特此總結了本篇文章,力爭做到簡單詳細。

狀態列分為前後兩部分:
前景部分:就是指的顯示電池、時間等部分;
背景部分:就是顯示黑色或者圖片的背景部分;
(參考自http://my.oschina.net/shede333/blog/304560 )本文說的狀態列顏色變化都是指前景部分,也是常需要處理的情況。背景部分的改變參考該部落格就可以了。

1. 更改啟動圖上狀態列顏色

如果在General裡面設定


1.png

設定為Light就可以將狀態列前景部分設定為白色,下面的Hide status bar勾選後可以隱藏狀態列。
如果在Info.plist裡面設定Status bar style項


2.png

效果一樣,兩種只要設定一個,另一個就會改變,不存在優先順序問題。

2. 統一設定app所有控制器view的狀態列顏色

需要了解View controller-based status bar appearance屬性:在info.plist檔案中,如果將該屬性設為YES,則控制器對狀態列的設定優先順序最高,可以在控制器中對狀態列顏色進行單獨修改。如果設定為NO的話,則以啟動圖設定為準,即app內部所有控制器view上狀態列前景部分顏色和啟動圖上保持一致,但是還可以通過UIApplication管理。

也就是說,統一設定狀態列顏色,如果想跟啟動圖上一樣的話,直接將該屬性設定為NO就行了。如果不想跟啟動圖一致,可以通過UIApplication設定。但是iOS9以後已經不建議使用UIApplication管理狀態列了,在此不做多的講解。

另外,如果在有導航控制器作為根控制器的情況下,可以通過以下設定:self.navigationController.navigationBar.barStyle = UIBarStyleBlack將導航條背景樣式設為黑色,所有狀態列的前景部分顏色就自動變為白色了。

3. 單獨設定某個控制器View的狀態列顏色(沒有被導航控制器包裹)

首先要將View controller-based status bar appearance設為YES,然後在該控制器內新增:

-(UIStatusBarStyle)preferredStatusBarStyle
{
     return UIStatusBarStyleLightContent;
}

4. 單獨設定某個控制器View的狀態列顏色(被導航控制器包裹)

還是要先將View controller-based status bar appearance設為YES,然後在該控制器內新增

-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

還不夠,需要自定義navigationController,然後在裡面重寫下面方法:

- (UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

這是因為被導航控制器包裹的控制器view上顯示的狀態列其實是導航控制器狀態列的樣式,所以用該方法將其樣式改寫。

因此,在有導航控制器的情況下,如果想統一設定app內控制器view狀態列顏色,而又不想與啟動圖上的一樣,又不使用UIApplication管理的方法,除了更改navigationBar.barStyle那個方式以外。還可以在自定義的navigationController裡面重寫preferredStatusBarStyle方法,如果還需要單獨定義某個控制器view的狀態列顏色,加入上面的設定就可以了,微博個人主頁示例中就用到了此方法。

5. 在控制器View中隨時更改狀態列顏色

需要呼叫下面的setNeedsStatusBarAppearanceUpdate方法,這個方法會通知系統去呼叫當前控制器的preferredStatusBarStyle方法,然後在preferredStatusBarStyle方法裡面根據情況來返回不同狀態就行了。

總結:

  1. 如果將View controller-based status bar appearance設定為NO,不在UIApplication管理的情況下,所有控制器view上狀態列的只受啟動圖導航欄顏色設定的影響(保持一樣),其它任何設定都不起作用。
  2. 如果將View controller-based status bar appearance設定為YES。所有控制器View上狀態列首先受navigationBar的barStyle影響,為UIBarStyleBlack時狀態列字型顏色為白色,UIBarStyleDefault時狀態列前景部分顏色為黑色。
    只有將View controller-based status bar appearance設定為YES的情況下,才能單獨修改某個控制器View的狀態列前景部分顏色,更改方法見3,4部分。