LoginSignup
102
93

More than 5 years have passed since last update.

ステータスバーのスタイル(色)変更方法優先度 まとめ

Last updated at Posted at 2015-12-03

iOS7からステータスバーのスタイルを変更できるようになりましたが、変更方法がいくつかあり、どれが優先されるのか挙動がわからなかったのでまとめました。

この記事ではiOS8以上を対象としていてiOS 9.1で動作確認を行っています。
(iOS7はシェアから考えてそろそろ切り捨てても大丈夫だと思います。まともに対応しようと思うと結構大変です)

ステータスバーの変更方法

TARGETS の Status Bar Style

ステータスバーの色を全体的に変更する場合に使うようですが変更してもMain.storyboardはLight(白)にはなりませんでした。
スプラッシュ画面(LaunchScreen.storyboard)のみステータスバーが白に変更されました

04ae72a4-1dc1-b248-90cc-843f02d0cc68.png

または

Status bar styleをUIStatusBarStyleLightContent

kobito.1449107488.618765.png

TARGETS の Status Bar Style + 「View controller-based status bar appearance」がNO

TARGETS の Status Bar Styleを Light にして Info に View controller-based status bar appearance を追加し NO を設定します。
この設定を追加するとMain.storyboardのステータスバーも白に変わりました。

この設定は全てのViewControllerのステータスバーのスタイルを同じ設定にする時に利用します。

kobito.1449108630.994290.png

StoryboardのStatusBar

こちらは変更してもステータスバーがLight(白)にはなりませんでした。
この設定はどういった場合に有効になるのか謎です。

kobito.1449107983.032591.png

コードから変更

以下のコードでステータスバーがLight(白)になりました。

ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()

        // ステータスバーのスタイル変更を促す
        self.setNeedsStatusBarAppearanceUpdate();
    }

    override func prefersStatusBarHidden() -> Bool {
        // trueの場合はステータスバー非表示
        return false;
    }

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        // ステータスバーを白くする
        return UIStatusBarStyle.LightContent;
    }

ナビゲーションバーがある時

コードから変更

以下のコードでステータスバーがLight(白)になりません。

ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()

        // ステータスバーのスタイル変更を促す
        self.setNeedsStatusBarAppearanceUpdate();
    }

    override func prefersStatusBarHidden() -> Bool {
        // trueの場合はステータスバー非表示
        return false;
    }

    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        // ステータスバーを白くする
        return UIStatusBarStyle.LightContent;
    }

以下のようにUINavigationControllerを継承したクラスを作りchildViewControllerForStatusBarStyle()をオーバーライドする必要があります。
参考 http://qiita.com/yimajo/items/7051af0919b5286aecfe

MyNavigationController.swift
import UIKit

override var childViewControllerForStatusBarStyle: UIViewController? {
    return self.visibleViewController
}

override var childViewControllerForStatusBarHidden: UIViewController? {
    return self.visibleViewController
}

Storyboard上で使っているNavigationControllerのクラスを作成したMyNavigationControllerに変更します

kobito.1449112359.051129.png

NavigationBarのスタイルにも影響を受ける

NavigationBarのスタイルをTranslucent Black Navigation Bar等の黒いナビゲーションバーに変更するとステータスバーは自動で白に変更されます。

kobito.1449112698.433437.png

各設定の優先順位

各設定の優先順位を以下にまとめました。

優先順位

優先順位 ステータスバーのスタイル設定方法
1 TARGETS の Status Bar Style + 「View controller-based status bar appearance」が NO で全てのページが同一のスタイルになる
2 コードから変更(親がNavigationBarの場合は継承してchildViewControllerForStatusBarStyle()をオーバーライドする必要あり)
3 NavigationBarのスタイル
設定されない TARGETS の Status Bar Style(スプラッシュ画面のみ影響)
設定されない Storyboard の Status Bar
102
93
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
102
93