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;
}
如果是 UINavigationController,則需要添加一個繼承自 UINavigationController 的子類,在子類中設定如下程式碼,使用子類來控制。或者添加 UINavigationController 的 Category,在 Category 中設定如下程式碼
原因是:UIViewController 嵌套在 UINavigationController 中時,會優先調用 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;
}