**前提 **
info.plist?文件中設置 View controller-based status bar appearance 為?YES
UINavgationController中覆寫preferredStatusBarStyle方法不執(zhí)行的問題
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad
{
? ? [super viewDidLoad];
}-(UIStatusBarStyle)preferredStatusBarStyle
{
? ? return UIStatusBarStyleDefault;
}@end
如果viewController不是在 UINavgationController中,那么以上代碼可以把狀態(tài)欄文本顏色設置為白色,但是如果 viewController是添加到導航上的,你會發(fā)現(xiàn)上面代碼達不到你想要的效果,狀態(tài)欄文本顏色是黑色的!
**這是為什么? **
經過查找資料,才知道原來是這么一回事:
*UINavigationController不會將 preferredStatusBarStyle方法調用轉給它的子視圖,而是由它自己管理狀態(tài),而且它也應該那樣做。因為UINavigationController 包含了它自己的狀態(tài)欄
,因此就算 UINavigationController中的viewController 實現(xiàn)了 preferredStatusBarStyle方法也不會調用 。
那 UINavigationController是怎么決定該返回 UIStatusBarStyleLightContent 還是 UIStatusBarStyleDefault的呢?
它是基于它的 UINavigationBar.barStyle屬性,默認(UIBarStyleDefault)的是黑色文本的狀態(tài)欄,而 UIBarStyleBlack是設置為白色文本的狀態(tài)欄,
也就是說,如果viewController是在導航中的,想要改變狀態(tài)欄文本顏色,那么需要通過代碼:
//? 將status bar 文本顏色設置為白色self.navigationController.navigationBar.barStyle = UIBarStyleBlack;//? 將status bar 文本顏色設置為黑色 ,默認就是黑色self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
另外,如果viewController在導航中,還想通過 preferredStatusBarStyle 方法設置狀態(tài)欄文本顏色,那就只能隱藏導航欄了:
// 隱藏導航欄后 系統(tǒng)會調用 preferredStatusBarStyle 方法self.navigationController.navigationBarHidden = YES;
另外我們也可以主動調用 preferredStatusBarStyle 方法
- (void)viewDidAppear:(BOOL)animated
{
? ? [super viewDidAppear:animated];
? ? // 必須放在 viewDidAppear: 方法里面才起效果(自動調用 preferredStatusBarStyle)? ? // 放在 viewWillAppear: 方法里面不起效果? ? [self setNeedsStatusBarAppearanceUpdate];
}