前言:新版本項(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拿到我面前搗鼓一番之后————好吧任岸,我改再榄。
先說(shuō)一下系統(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中重寫(xiě)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í),該方法無(wú)效艺蝴;
View controller-based status bar appearance為NO時(shí)猬腰,該方法有效;
然后在需要改變導(dǎo)航欄的VC中實(shí)現(xiàn)這一方法猜敢,例如姑荷,需要將當(dāng)前界面狀態(tài)欄變?yōu)榘咨渌J(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)這么寫(xiě)并沒(méi)有什么用??鼠冕,這時(shí)我們就需要使用第二種方法。
二胯盯、在vc中重寫(xiě)preferredStatusBarStyle方法:
在iOS7之后懈费,蘋(píng)果為我們提供了另一種設(shè)置狀態(tài)欄顏色的方法:- (UIStatusBarStyle)preferredStatusBarStyle,在需要改變狀態(tài)欄樣式的VC中重寫(xiě)這一方法即可:
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
然而博脑,這只在我們當(dāng)前的VC沒(méi)有嵌套在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君账,在該類別中重寫(xiě)- (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;
}