今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

iOS ステータスバーの設定

iOS StatusBar 設定#

背景#

最近、StatusBar の設定に関する問題に遭遇しました。NavigationController から表示される画面で StatusBar を設定しても効果がなく、以前に同様の問題に遭遇したことがある記憶がありますが、まとめを記録していなかったため、原因を見つけるのに少し時間がかかりました。そのため、すぐに記録しておきます。

グローバル設定#

StatusBar のグローバル設定では、まず info.plist ファイルで View controller-based status bar appearance を NO に設定し、画面ごとの StatusBar の表示をオフにします。

表示 / 非表示#

方法 1:Target の Deployment Info で Hide status bar のチェックを外す / 入れる

wecom20210630-151212@2x.png

方法 2:コードで設定

[UIApplication sharedApplication].statusBarHidden = YES;

スタイル設定#

方法 1:Target の Deployment Info で Status Bar Style を設定

wecom20210630-151212@2x.png

方法 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;
}

参考#

iOS 開発 - Status Bar 設定まとめ

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。