iOS ステータスバーの設定#
背景#
最近、ステータスバーの設定に関する問題に直面しました。NavigationController から表示される画面でステータスバーを設定しても、ずっと効果がありませんでした。このような問題に遭遇した記憶がありますが、記録していなかったため、原因を見つけるのに少し時間がかかりました。そこで、急いで記録することにしました。
グローバル設定#
ステータスバーのグローバル設定は、まずinfo.plist
でView controller-based status bar appearance
を NO に設定し、画面によるステータスバーの表示を無効にする必要があります。
表示 / 非表示#
方法一: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 に設定し、画面によるステータスバーの表示を有効にします。
通常の 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;
}
問題#
モーダルで表示された 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;
}