iOS StatusBar 設定#
背景#
最近、StatusBar の設定に関する問題に遭遇しました。NavigationController から表示される画面で StatusBar を設定しても効果がなく、以前に同様の問題に遭遇したことがある記憶がありますが、まとめを記録していなかったため、原因を見つけるのに少し時間がかかりました。そのため、すぐに記録しておきます。
グローバル設定#
StatusBar のグローバル設定では、まず info.plist
ファイルで View controller-based status bar appearance
を NO に設定し、画面ごとの StatusBar の表示をオフにします。
表示 / 非表示#
方法 1:Target の Deployment Info で Hide status bar
のチェックを外す / 入れる
方法 2:コードで設定
[UIApplication sharedApplication].statusBarHidden = YES;
スタイル設定#
方法 1:Target の Deployment Info で Status Bar Style
を設定
方法 2:コードで設定
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
個別画面の設定#
まず、info.plist
ファイルで View controller-based status bar appearance
を YES に設定し、画面ごとの StatusBar の表示をオンにします。
通常の ViewController の設定:
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleDefault;
}
UINavigationController の場合、UINavigationController を継承したサブクラスを追加し、以下のコードをサブクラスで設定するか、UINavigationController のカテゴリを追加し、カテゴリで以下のコードを設定する必要があります。
理由は、UIViewController が UINavigationController にネストされている場合、UIViewController の preferredStatusBarStyle
よりも先に 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;
}