0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-02

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

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?