轉(zhuǎn)載請注明出處:http://www.reibang.com/p/06c66676609a
作者:紀小衰
最近發(fā)現(xiàn)狀態(tài)欄有很多問題拉背,故寫個demo驗證下做個記錄
測試環(huán)境:iOS11
1.狀態(tài)欄的隱藏與顯示
在工程的info.plist中可以設(shè)置屬性View controller-based status bar appearance來控制狀態(tài)欄的控制方式悦施,
當值為YES的時候,狀態(tài)欄的隱藏和顯示取決于當前顯示的viewController的覆寫prefersStatusBarHidden方法去团,不重寫則默認顯示
(此時application控制無效)
- (BOOL)prefersStatusBarHidden{
return NO;
}
當值為NO的時候,狀態(tài)欄的隱藏和顯示可以通過application的屬性來進行控制(此時復寫方法無效)
[UIApplication sharedApplication].statusBarHidden = YES;
當不配置info.plist中的屬性時,默認是根據(jù)controller復寫的狀態(tài)欄隱藏方法來判斷的
推薦:info.plist中的屬性設(shè)置為YES土陪,通過每個viewController覆寫對應(yīng)的方法決定自己的界面顯示時是否顯示狀態(tài)欄
2.狀態(tài)欄的風格
狀態(tài)欄的風格和顯示同樣有兩種控制方式昼汗,方式一基于info.plist中View controller-based status bar appearance設(shè)置為NO,
此時通過下面的方法控制導航欄的風格
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
推薦還是下面這種使用每個控制器決定自己的導航欄風格方式
1.1對于一般的UIViewController可以通過覆寫preferredStatusBarStyle方法來控制狀態(tài)欄的風格
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent; //顯示白色的狀態(tài)欄
}
1.2當一個UIViewController有自己的UINavigationController時鬼雀,則此時的狀態(tài)欄控制方法不會被調(diào)用顷窒,狀態(tài)欄的風格取決于導航欄的風格。解決這種問題有兩種方案
方案1:(但是一般好像這種方案不會被采用源哩,因為要修改導航欄的樣式)
通過self.navigationController.navigationBar.barStyle來修改導航欄風格
當設(shè)置UIBarStyleBlack時顯示黑色的導航欄鞋吉,白色的狀態(tài)欄;
當設(shè)置為UIBarStyleDefault時顯示白色的導航欄励烦,黑色的狀態(tài)欄
方案2:子類化UINavigationController谓着,然后覆寫childViewControllerForStatusBarStyle方法,讓當前的狀態(tài)欄風格取決于導航控制器的棧頂VC坛掠,這是viewController的preferredStatusBarStyle就可以起作用了
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
1.3修改初始狀態(tài)欄風格
通過設(shè)置info.plist中Status bar style中屬性為UIStatusBarStyleDefault或UIStatusBarStyleLightContent
1.4在同一個界面動態(tài)修改狀態(tài)欄風格赊锚,下面給出一種解決方案
@property (assign, nonatomic) UIStatusBarStyle style;
- (void)awakeFromNib{
[super awakeFromNib];
/*
不要在viewDidLoad設(shè)置初始值,因為preferredStatusBarStyle會在viewDidLoad之前調(diào)用屉栓,
可以根據(jù)控制器創(chuàng)建方式?jīng)Q定放在awakeFromNib或者init方法中
*/
self.style = UIStatusBarStyleLightContent;
}
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.style = UIStatusBarStyleDefault;
//調(diào)用下面的方法才能使界面再下一次刷新繪制的時候重新調(diào)用preferredStatusBarStyle改變狀態(tài)欄
[self setNeedsStatusBarAppearanceUpdate];
});
}
- (UIStatusBarStyle)preferredStatusBarStyle{
return self.style;
}
對于同一個界面狀態(tài)欄的隱藏和顯示動態(tài)改變也可以采用上面的思路舷蒲,但是有些時候狀態(tài)欄的顯示和隱藏會導致界面布局的問題,建議還是不要動態(tài)更改