iosのステータスバー表示方法についてのまとめ


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にコピペすれば試せるようにしました。このコードほとんど先人からの参照ベースですが、
コード断片書くよりぺろっと貼れて使いやすいので残しておきます。

```objective-c: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チェックしよう。