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


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

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

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

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

![04ae72a4-1dc1-b248-90cc-843f02d0cc68.png](https://qiita-image-store.s3.amazonaws.com/0/27793/3d58707d-7e23-d97a-9097-92540bb048d8.png "04ae72a4-1dc1-b248-90cc-843f02d0cc68.png")


または

Status bar styleをUIStatusBarStyleLightContent

![kobito.1449107488.618765.png](https://qiita-image-store.s3.amazonaws.com/0/27793/f216fbdf-4466-e254-66bc-dc7cc858c6d0.png "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](https://qiita-image-store.s3.amazonaws.com/0/27793/04e99d3c-d0ba-73db-a9c1-f2f32e2720b3.png "kobito.1449108630.994290.png")




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

![kobito.1449107983.032591.png](https://qiita-image-store.s3.amazonaws.com/0/27793/d70dbd58-d8ca-6af2-7e1d-72d73457eb69.png "kobito.1449107983.032591.png")


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

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

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

    override func prefersStatusBarHidden() -> Bool {
        // trueの場合はステータスバー非表示
        return false;
    }
    
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        // ステータスバーを白くする
        return UIStatusBarStyle.LightContent;
    }
```

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

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

```swift: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

```swift: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](https://qiita-image-store.s3.amazonaws.com/0/27793/e20ffe62-9258-43aa-042a-43e8ec382c0a.png "kobito.1449112359.051129.png")

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

![kobito.1449112698.433437.png](https://qiita-image-store.s3.amazonaws.com/0/27793/ff99de95-6c07-c73a-5aa3-43f62814511b.png "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    |