cockscomblog?

cockscomb on hatena blog

iOS 7におけるUIStatusBarStyleのベストプラクティス

photo by Janitors

前提

iOS 7からView Controller単位でステータスバーを設定しやすいようになりました。

ベストプラクティス

Info.plist

はじめに、Info.plistでUIViewControllerBasedStatusBarAppearanceNOになっていないことを確認します。NOだったらこれまでと同様

[UIApplication sharedApplication].statusBarStyle

で設定することになります。

アプリ起動時のDefaultイメージでは、Info.plistが優先されるので、Info.plistでUIStatusBarStyleを設定しておきます。

UIViewController

ここからView Controllerでの設定についてみていきます。重要なのはUIViewControllerのふたつのメソッドです。

preferredStatusBarStyle

ひとつめは

- (UIStatusBarStyle)preferredStatusBarStyle

で、これはそのView Controllerがどういうステータスバーが良いかを表現するためのメソッドです。適宜オーバーライドして、UIStatusBarStyleDefaultUIStatusBarStyleLightContentのどちらかを返します。

childViewControllerForStatusBarStyle

もうひとつは

- (UIViewController *)childViewControllerForStatusBarStyle

です。このメソッドでnilを返すと、上で説明したpreferredStatusBarStyleが使われます。なんらかのView Controllerを返したときは返したView Controllerの要求に従います。このメソッドはView Controllerのコンテナ的なView Controllerで使われます。例えばUITabBarControllerではこのメソッドが実装されていて、selectedViewControllerが返っているように見えます。

コンテナ

ここからが問題で、UINavigationControllerではchildViewControllerForStatusBarStylenilを返しています。とはいえNavigation Controllerを使っていてステータスバーのスタイルを変えたいとき、UINavigationControllerをサブクラスするのは感心しません。よりよいのは、UINavigationBar

@property(nonatomic, assign) UIBarStyle barStyle

を設定することです。UIBarStyleにはUIBarStyleDefaultUIBarStyleBlackがあります。これらが設定されたとき、UIStatusBarStyleはそれぞれUIStatusBarStyleDefaultUIStatusBarStyleLightContentになります。

追記(2016/07/01)

navigationBarHidden が真のとき、visibleViewControllerchildViewControllerForStatusBarStyle になるそうです。Navigation Bar の色合いなどを反映する必要がないので、納得ですね。

あとUISplitViewControllerのときはどうしたらいいのか分からなかった。サブクラスしてpreferredStatusBarStyleをオーバーライドする以外になんかできるなら知りたいので皆さまの知見を募集いたします。

参考

iOS Keys

Mastering iOS 7 UIStatusBarStyle (Example) | Coderwall