なんとかするから、なんとかなる

エンジニア関係のことを書きます

iOSでステータスバーの色を変更する

はじめに

iOSのStatusBarの色を変更したいことはよくあります。

でも、やりかたをよく忘れてしまいます。

なので、まとめます。

アプリ全体での色の設定

  1. info.plistで "View controller-based status bar appearance"にNOを設定
  2. appDelegate.swift のdidFinishLaunchingWithOptions内で以下を設定
UIApplication.shared.statusBarStyle = .lightContent

画面個別での色の設定

各画面のViewController以下の値をOverride。ただしGetterしかありません。

override func preferredStatusBarStyle: UIStatusbarStyle {
      return .lightContent // 白くする
}

ただし、ステータスバーの色を同一ViewController内で変更した場合、次のメソッドを呼ぶ必要があります。

setNeedStatusBarAppearanceUpdate()

解説

"View controller-based status bar appearance"について

  • YES: デフォルトの設定であり、ViewControllerごとに設定
  • NO: アプリ全体として設定する

したがって、NOを設定した場合は、UIApplication.sharedで一括設定しています。 もしくは、Applicationの[Target]-[Status Bar Style]で設定します。

一方で画面ごと変更したい場合は、プロパティをOverrideします。 ただし、NavigationViewControllerなどを使っている場合は、その他の設定方法になるので、そのうちまとめたいと思います。

お遊び

以上より、次のようなコードを書くとタップするたびにステータスバー色を変えることができます。

var _preferredStatusColor: UIStatusBarStyle = .lightContent {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}
    
override var preferredStatusBarStyle: UIStatusBarStyle {
    return self._preferredStatusColor
}
        
@IBAction func change(_ sender: Any) {
    if self._preferredStatusColor == .lightContent {
        self._preferredStatusColor = .default
    } else {
        self._preferredStatusColor = .lightContent
    }
}