今是昨非

今是昨非

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

iOS ステータスバーの設定

iOS ステータスバーの設定#

背景#

最近、ステータスバーの設定に関する問題に直面しました。NavigationController から表示される画面でステータスバーを設定しても、ずっと効果がありませんでした。このような問題に遭遇した記憶がありますが、記録していなかったため、原因を見つけるのに少し時間がかかりました。そこで、急いで記録することにしました。

グローバル設定#

ステータスバーのグローバル設定は、まずinfo.plistView controller-based status bar appearanceを NO に設定し、画面によるステータスバーの表示を無効にする必要があります。

表示 / 非表示#

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

wecom20210630-151212@2x.png

方法二:コード設定

[UIApplication sharedApplication].statusBarHidden = YES;

設定#

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

wecom20210630-151212@2x.png

方法二:コード設定

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

インターフェースの個別設定#

まずinfo.plistView 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;
}

参考#

iOS 開発 - ステータスバー設定のまとめ

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