iOS7のステータスバーが厄介

iPhoneのアプリなればこそ特徴的な処理も施さねばならず ステータスバーの措置は其の一つと言えるでしょう。 ゲーム画面に於いては基本的にステータスバーは表示は好ましくなけれど ゲーム画面を離れた設定画面では時間や電池残量などの把握のためにも表示した方が宜しかろう、 などと考慮するから発展するに 任意に表示、非表示を制御すべし、との目論見を抱いたのでしたが、 然うは問屋が卸してはくれませんでした。

Ballons Occupy ステータスバー

今回結論から言えばアプリ全体を通して ステータスバーを非表示設定にさせるように落ち着いたのですが 少しく試行錯誤を記し置くものです。

スポンサーリンク
日付:2014年3月3日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.1
Xcodeバージョン:5
言語:Objective-C
関連アプリ:uPanda Breaks Out Fruits

目論見を実現するとなれば遷移する画面毎にステータスバーの状態を変える必要があり、 となれば ViewController 単位で制御する必要があるのですが此れが慣れない身には少なからぬ困難な状況を出来させます。

例に依ってネットを繰ればQiitaの2013年9月24日に其の題目も iOS7ステータスバー対策まとめ なる記事が見付かり View controller-based status bar appearance 項目を YES と全般に先ずはステータスバーを表示するものと設定し其の上で ViewController内で其の画面のみ隠すべく上書き記述すれば思うところ得られんと仮定したもの、 即ち

// ステータスバーの表示/非表示メソッド呼び出し
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
  // iOS 7以降
  [self prefersStatusBarHidden];
  [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
} else {
  // iOS 7未満
  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; }

-(void)viewDidLoad 辺りに書き込んで ViewController メソッド prefersStatusBarHidden

- (BOOL)prefersStatusBarHidden {
  return YES;
}

のように上書きすれば良い筈との期待も鮮やかに裏切られるのでした。 上の様に書く根拠はiOS7でUINavigationControllerやUITabBarControllerをつかう場合は 内部のViewControllerの preferredStatusBarStyleprefersStatusBarHidden が呼び出されないとされていたからであるのですがどうも認識が誤っているようです。 またinfo.plistを

  • Status bar is initially hidden:NO
  • View controller-based status bar appearance:NO

の如く設定すると先ず設定画面 (アプリ内では SETTING と表示) に進んで表示され、続いてゲーム画面へと PLAY をタップして進むと一見実装が効いているように見えはするのですが、 PLAYの後再びMENUに戻り、 恐らく此処でViewContorollerが活きるのではないかと考えるところ、 再びSETTINGに進むと以下の記述が効いてしまい 上からステータスバーがアニメーションして降りて来るのに対して ステータスバー用の縦幅マージンが取られておらず ナビゲーションバーと重なって表示されてしまうのでした。

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

サイト 始める!!iPhoneアプリ の2013年10月13日の記事 Xcode5 電波情報などのステータスバーを消す(View controller-based status bar appearance) を参考にしたりしつつ

  • View controller-based status bar appearance:NO

と設定することでiOS7以前のソースが効けば、 info.plist に同項目を YES 設定とすればステータスバーを考慮してナビゲーションバーが表示されるものと考え、 であれば此の設定で以下の条件分岐が働けば万々歳となるところ 然うは問屋が卸さない塩梅。

if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

以上に因り拘泥すれば制御出来ないまま時間ばかり経ってしまうので アプリケーション単位で非表示にする方法を採択して次に進むことにした次第。 此れ等の想定通りことが運ばないのには達て ViewControllerのモーダル画面遷移の理解が浅いのにも因が求められる気はすれど いつまでも此の儘捨て置くよりも先ずは進捗をと方法は最も簡単な方法を採用すべく StatusBarの外観をアプリケーション単位で行うinfo.plistの設定で良しとし、 以下の項目をば処理したものです。

  • Status bar is initially hidden:YES
  • View controller-based status bar appearance:NO
  • TARGETS > General > Deployment Info > Status Bar Style > Hide during application launch::check

此れにてアプリ全体を通して非表示にはなりますが、 此処に落として全体の状況は取り留めも付かぬ記事となったのは試行錯誤の備忘録としてご寛恕あられたく、 以下の記述があれば関わらず表示される事態となるのでご注意あれ。

[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]

※ なお本記事の添え画像はBalloons Occupyのもので ステータスバーについて方針も変わり少し理解が進んだ後実装したものですが 機会あれば記すこともあるでしょう。

Balloons Occupy
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 3.0
リリース: 2015年1月29日
更新: 2020年9月1日
サイズ : 13 MB
互換性: iOS 8.0 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。
uPanda Breaks Out Fruits
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 4.12
リリース: 2014年9月15日
更新: 2022年4月20日
サイズ : 10.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。