LoginSignup
42
31

More than 5 years have passed since last update.

ステータスバーの色が決まるロジック

Last updated at Posted at 2016-09-22

ちゃんと理解してなかったので覚え書き。

まず、大きく分けて2種類

Info.plist の
View controller-based status bar appearance

① YESなら画面ごとで設定(デフォ) 👈 これについて
② NOならアプリ全体で統一

②のようにアプリ全体で統一する場合は以下のようなコードでいつでも変更可能だけど、画面ごとにステータスバーの色が決まるような普通のアプリだと管理が大変なのであまり使われない。(と思う)

UIApplication.sharedApplication().statusBarStyle = .LightContent

この記事では①についてまとめようと思います。(覚え書き)

UIViewControllerの2つのメソッドで決まる

func preferredStatusBarStyle() -> UIStatusBarStyle

スタイルを返す。

func childViewControllerForStatusBarStyle() -> UIViewController?

スタイルを 子のViewControllerに委託 するときにつかう。
何かを返した場合は、そのChildViewControllerのpreferredStatusBarStyleが呼ばれて、自身のは呼ばずにずスルーする。
(デフォルトはnil)

気をつけるべきなのはUINavigationControllerがある場合の挙動

以下の2点を気をつける必要がある。

  1. 中身のViewControllerに委託してると思いがちだけど、なにもしなければUINavigationController自身がスタイルを決定する。
    (こいつも普通のUIViewControllerと挙動は変わらずchildViewControllerForStatusBarStyleが nilを返す)

  2. navigationBarHiddenがtrueの場合はスタイルを中身のViewControllerに委託するようになっている。
    (childViewControllerForStatusBarStyle が visibleViewController を返す)

つまり

navigationBarHidden が false の場合は 自分で決める(デフォ)
navigationBarHidden が true の場合は visibleViewController に委託

こうなってんのかなUINavigationController.swift
override func childViewControllerForStatusBarStyle() -> UIViewController? {
    return navigationBarHidden ? visibleViewController : nil
}

navigationBarHiddenがfalseだけど中身のViewControllerで色を決めたい場合は

  • 継承して childViewControllerForStatusBarStyle で visibleViewController を返す

or

  • UINavigationBarのbarStyleを設定 (UINavigationBarを黒にすると自動でステータスバーが白くなることを利用するやりかた。継承せずに済むけど綺麗なやり方ではない。)

動的なステータスバースタイルの更新

例えばChildViewControllerを閉じた場合など、自動で preferredStatusBarStyle() が呼ばれないときはsetNeedsStatusBarAppearanceUpdateを呼んで更新を促す。

これを利用して、ViewController内で動的にステータスバーを表示/非表示したり、色を変えたりすることも可能。


// この変数に値をいれたときに変わる
var statusBarStyle: UIStatusBarStyle = .Default {
    didSet {
        guard oldValue != statusBarStyle else { return }
        UIView.animateWithDuration(0.4) {
            setNeedsStatusBarAppearanceUpdate()
        }
    }
}

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return statusBarStyle
}

// この変数に値をいれたときに変わる
var statusBarHidden = false {
    didSet {
        guard oldValue != statusBarHidden else { return }
        UIView.animateWithDuration(0.4) {
            setNeedsStatusBarAppearanceUpdate()
        }
    }
}

override func prefersStatusBarHidden() -> Bool {
    return statusBarHidden
}

ちなみにステータスバー変化のアニメーションは以下で指定する

override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
    return .Fade
}

他にもStoryBoardやTargetの設定項目にもあるらしい

優先順位もあるらしい

ステータスバーのスタイル(色)変更方法優先度 まとめ
http://qiita.com/ux_design_tokyo/items/8e62977b7609e68755c7

参考

http://cockscomb.hatenablog.com/entry/2013/11/12/190905
http://qiita.com/yimajo/items/7051af0919b5286aecfe

42
31
0

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
42
31