iOS StatusBar 設置#
背景#
最近遇到設置 StatusBar 的問題,在 NavigationController 出來的界面設置 StatusBar 後一直不生效,印象中遇到過此類的問題,但是沒有記錄總結,還是花費了一點時間來找到原因,所以趕緊記錄一下。
全局設置#
StatusBar 的全局設置,需要首先在info.plist
中設置View controller-based status bar appearance
為 NO,關掉按界面設置 status bar 顯示。
顯示 / 隱藏#
方法一:在 Target 下的 Deployment Info 中不勾選 / 勾選Hide status bar
方法二:代碼設置
[UIApplication sharedApplication].statusBarHidden = YES;
設置#
方法一:在 Target 下的 Deployment Info 中設置Status Bar Style
方法二:代碼設置
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
界面單獨設置#
首先在info.plist
中設置View controller-based status bar appearance
為 YES,打開按界面設置 status bar 顯示。
普通的 ViewController 設置:
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
如果是 UINavigaitonController,則需要添加一個繼承自 UINavigationController 的子類,在子類中設置如下代碼,使用子類來控制。或者添加 UINavigaitonController 的 Category,在 Category 中設置如下代碼
原因是:UIViewController 嵌套在 UINavigaitonController 中時,會優先調用 UINavigationController 的preferredStatusBarStyle
,所以直接在 UIViewController 中設置是不生效的。
- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.topViewController preferredStatusBarStyle];
}
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
問題#
modal 出來的 viewController 設置了 prefersStatusBarHidden 不生效的問題,需要設置 modalPresentationCapturesStatusBarAppearance 為 YES;
@implementation TargetViewController
- (instancetype)init {
self = [super init];
if (self) {
self.modalPresentationStyle = UIModalPresentationOverFullScreen;
self.modalPresentationCapturesStatusBarAppearance = YES;
}
return self;
}
- (BOOL)prefersStatusBarHidden {
return YES;
}