前言:新版本項(xiàng)目UI界面上做了很大的改動(dòng),要求狀態(tài)欄字體顏色也要跟著界面做出動(dòng)態(tài)的改變。在我對(duì)設(shè)計(jì)的理解中,狀態(tài)欄作為系統(tǒng)部件,不屬于App內(nèi)部元素,最好是不應(yīng)該被頻繁改動(dòng)的。直到設(shè)計(jì)把支付寶App拿到我面前搗鼓一番之后————好吧,我改。
先說一下系統(tǒng)提供的狀態(tài)欄類型:
UIStatusBarStyleDefault : 狀態(tài)欄字體為黑色(默認(rèn))
UIStatusBarStyleLightContent :狀態(tài)欄字體為白色
動(dòng)態(tài)切換狀態(tài)欄的方式有兩種:
1、調(diào)用[UIApplication sharedApplication].statusBarStyle方法
2、在vc中重寫preferredStatusBarStyle方法
一、調(diào)用[UIApplication sharedApplication].statusBarStyle方法:
使用這一方法的前提是,在info.plist中,設(shè)置View controller-based status bar appearance值為NO(默認(rèn)為YES)。

View controller-based status bar appearance為YES時(shí),該方法無效;
View controller-based status bar appearance為NO時(shí),該方法有效;
然后在需要改變導(dǎo)航欄的VC中實(shí)現(xiàn)這一方法,例如,需要將當(dāng)前界面狀態(tài)欄變?yōu)榘咨?,其他默認(rèn)為黑色:
- (void)viewWillAppear:(BOOL)animated{
//
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
}
- (void)viewDidDisappear:(BOOL)animated{
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}
注:當(dāng)我們需要較頻繁的動(dòng)態(tài)切換界面上狀態(tài)欄樣式時(shí),會(huì)發(fā)現(xiàn)這么寫并沒有什么用??,這時(shí)我們就需要使用第二種方法。
二、在vc中重寫preferredStatusBarStyle方法:
在iOS7之后,蘋果為我們提供了另一種設(shè)置狀態(tài)欄顏色的方法:- (UIStatusBarStyle)preferredStatusBarStyle,在需要改變狀態(tài)欄樣式的VC中重寫這一方法即可:
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
然而,這只在我們當(dāng)前的VC沒有嵌套在UINavigationController中的情況下才有效;
原因是當(dāng)我們當(dāng)前的VC嵌套在UINavigationController中時(shí), - (UIStatusBarStyle)preferredStatusBarStyle消息發(fā)出后,系統(tǒng)只會(huì)調(diào)用UINavigationController中的該方法,而不會(huì)調(diào)用VC中的該方法。
解決方法:
創(chuàng)建一個(gè)UINavigationController的類別UINavigationController+Statubar,在該類別中重寫- (UIStatusBarStyle)preferredStatusBarStyle方法:
#import "UINavigationController+StatusBar.h"
@implementation UINavigationController (StatusBar)
- (UIStatusBarStyle)preferredStatusBarStyle{
//找到當(dāng)前棧中最上層的試圖,調(diào)用其preferredStatusBarStyle方法
return [[self topViewController]preferredStatusBarStyle];
}
@end
然后在需要改變狀態(tài)欄風(fēng)格的視圖中實(shí)現(xiàn)- (UIStatusBarStyle)preferredStatusBarStyle方法:
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}