ちゃんと理解してなかったので覚え書き。
まず、大きく分けて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点を気をつける必要がある。
-
中身のViewControllerに委託してると思いがちだけど、なにもしなければUINavigationController自身がスタイルを決定する。
(こいつも普通のUIViewControllerと挙動は変わらずchildViewControllerForStatusBarStyleが nilを返す) -
navigationBarHiddenがtrueの場合はスタイルを中身のViewControllerに委託するようになっている。
(childViewControllerForStatusBarStyle が visibleViewController を返す)
つまり
navigationBarHidden
が false の場合は 自分で決める(デフォ)
navigationBarHidden
が true の場合は visibleViewController に委託
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