iosのステータスバーの表示と非表示については、いまだに複雑なパラメータの連携があってすぐに忘れます。なぜ忘れるのか。できるだけ網羅的にまとめてみました。
設定項目の対応関係
まず関連する設定項目とその意味を列挙してみました。これを掴まないと話が進みませんね。
機種 | General(✅) | info(Key) | 意味 |
---|---|---|---|
iphone | hide status bar | Status bar is initially hidden | iPhoneのアプリ起動画面のステータスバーを隠すか? |
ipad | hide during Application launch | UIStatusBarHidden~ipad | iPadのアプリ起動画面のステータスバーを隠すか? |
両方 | Generalに設定無し | View controller-based status bar appearance (直接infoに記述) | アプリ動作中の画面のステータスバー表示をコード記述によって設定するか? |
General(✅) は、Xcodeでプロジェクトファイルを開いた際、TARGETSを選択した時のGeneralタブの設定項目のチェックボックスのことです。
上記の二つの項目は あくまで「launch screen 表示に対する指定」です。「アプリ動作中の指定でない」ことがポイントです。ただし、動作しているViewController側でこの設定を参照するケースもあります。View controller-based status bar appearanceキーが NOに設定されている場合です。
その場合、iPhone/iPadごとに hide status bar(iPhone)/hide during Application launch(iPad)の設定はシステムによって引き継がれ、ステータスバーの表示・非表示が(勝手に)決定されます。
逆に、この設定がYESの場合、開発者がViewControllerごとに表示・非表示を切り替えることができます。
プロジェクト設定項目のツリー状一覧
インデントはパン屑です。項目名を探して辿っていただきたい。
xcodeproj
TARGETS
General
deployment info (iPhoneのチェックあり)
status bar style
hide status bar (ON/OFF するとinfoにStatus bar is initially hidden YES/NOの項目が現れる)
deployment info (ipadのチェックあり、かつiphoneのチェック無し)
status bar style
hide during Application launch (チェックボックスが現れる)
(info にUIStatusBarHidden~ipadが現れる)
info(最初は何もない)
Status bar is initially hidden(iphoneの場合 general のhide status bar をON/OFFする)
UIStatusBarHidden~ipad(ipadの場合 general のhide during Application launch ON/OFFする)
View controller-based status bar appearance(自分で記述する必要がある)
info設定値の効果について
・ Status bar is initially hidden YES/NO
iphoneに効果。launchする時LaunchScreen のステータスバーの非表示(YES)・表示(NO)を決定する
・ UIStatusBarHidden~ipad 1/0
ipadに効果。launchする時LaunchScreen のステータスバーの非表示(1)・表示(0)を決定する
・ View controller-based status bar appearance YES/NO
ViewController単位でstatus barを制御するかどうかを決める
・ iphoneの場合
・ View controller-based status bar appearance NOの場合
Status bar is initially hidden YESの場合
ビューのステータスバーを非表示
Status bar is initially hiddenがNO
ビューのステータスバーを表示
・ View controller-based status bar appearance YESの場合
launch表示と関係なくフォアグラウンドにいるViewControllerの
ステータスバー関連のコードに従う。隠すコードがあれば隠れる、コードがなければ表示される。
遷移が有る場合フォアグラウンドのVCごとに表示が変えられる
・ ipadの場合
・ View controller-based status bar appearance NOの場合
UIStatusBarHidden~ipad 1の場合
ビューのステータスバーを非表示
UIStatusBarHidden~ipad 0の場合
ビューのステータスバーを表示
・ View controller-based status bar appearance YESの場合
launch表示と関係なくと関係なくフォアグラウンドにいるViewControllerの
ステータスバー関連のコードに従う。隠すコードがあれば隠れる、コードがなければ表示される。
遷移が有る場合フォアグラウンドのVCごとに表示が変えられる
info設定値の効果一覧
なんか箇条書きしてもわかりにくいんで表にしました。案外パターンがいっぱい。キーの状態に関しては2パターンでなく、キーが存在してないケースあるから3パターンになります。結局はKey無しはNO相当なんですけど、設定状態としてはありうるので。あと、ターゲットがiphoneとipadで同時にONになっている場合は、それぞれのinfoの値を照合してそれぞれ確認してください。
機種 | Status bar is initially hidden | UIStatusBarHidden~ipad | View controller-based status bar appearance | launch bar | VC bar |
---|---|---|---|---|---|
iphone | Key無し | 無効 | Key無し | 表示 | 表示 |
iphone | YES | 無効 | Key無し | 非表示 | 表示 |
iphone | NO | 無効 | Key無し | 表示 | 表示 |
iphone | Key無し | 無効 | YES | 表示 | コードに従う |
iphone | YES | 無効 | YES | 非表示 | コードに従う |
iphone | NO | 無効 | YES | 表示 | コードに従う |
iphone | Key無し | 無効 | NO | 表示 | 表示 |
iphone | YES | 無効 | NO | 非表示 | 非表示 |
iphone | NO | 無効 | NO | 表示 | 表示 |
iPad | 無効 | Key無し | Key無し | 表示 | 表示 |
iPad | 無効 | 1 | Key無し | 非表示 | 表示 |
iPad | 無効 | 0 | Key無し | 表示 | 表示 |
iPad | 無効 | Key無し | YES | 表示 | コードに従う |
iPad | 無効 | 1 | YES | 非表示 | コードに従う |
iPad | 無効 | 0 | YES | 表示 | コードに従う |
iPad | 無効 | Key無し | NO | 表示 | 表示 |
iPad | 無効 | 1 | NO | 非表示 | 非表示 |
iPad | 無効 | 0 | NO | 表示 | 表示 |
※ launch bar launch screen時のステータスバー
※VC bar アプリの通常画面のステータスバー
※Key無し キー自体の設定がinfoに存在しないケース
※無効 機種によって、設定があってもなくても、値がどうでも効果がないこと
※コードに従う コードがあればそれに従って表示も非表示も柔軟に変わります。
VC側で表示の制御をする場合
プロジェクト作ってViewController.mにコピペすれば試せるようにしました。このコードほとんど先人からの参照ベースですが、
コード断片書くよりぺろっと貼れて使いやすいので残しておきます。
#import "ViewController.h"
@interface ViewController ()
@property BOOL shouldBeHidingStatusBar;
@end
@implementation ViewController
- (void) viewDidLoad
{
[super viewDidLoad];
// [self hideStatusBar];
// [self showStatusBar];
}
#pragma mark - ステータスバーの処理を個別にカスタマイズするためにオーバーライド
- (UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleDefault;
}
- (BOOL) prefersStatusBarHidden
{
return self.shouldBeHidingStatusBar;
}
- (UIStatusBarAnimation) preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationSlide;
}
#pragma mark - ステータスバー制御メソッド
- (IBAction) hideStatusBar
{
self.shouldBeHidingStatusBar = YES;
[UIView animateWithDuration:0.5 animations:^{[self setNeedsStatusBarAppearanceUpdate];}];
}
- (IBAction) showStatusBar
{
self.shouldBeHidingStatusBar = NO;
[UIView animateWithDuration:0.5 animations:^{[self setNeedsStatusBarAppearanceUpdate];}];
}
@end
注意
プロジェクトファイル>TARGETS>General>deployment infoのチェックボックスのiphoneをON/OFFしてipadだけにするとhide status bar の項目がhide during Application launch になったりする。
それらの項目をチェックをして初めてinfoの側に当該項目キーが現れたりするので混乱しやすい。
infoの値とチェックボックスは連動しないものがある。info側だけに値を設定しても効果が出るのでgeneralタブのチェックボックスだけを見ていると設定を間違える。infoチェックしよう。