hachinoBlog

hachinobuのエンジニアライフ

iOS7でステータスバーの領域が黒く塗りつぶされてしまう場合の対処方法

背景

iOS7でNavigationControllerのNavigationBarを使用しているにも関わらず下記のようにステータスバーが黒く塗りつぶされてしまい対応するのに時間を要してしまったのでメモ。

f:id:hachinobu:20140417134442p:plain

原因

この現象になる原因としてはiOS6以前でUINavigaitonBarに画像を下記のように設定していた。

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"header-44.png"] forBarMetrics:UIBarMetricsDefault];

header-44.pngは名前の通り高さが44ptなので、iOS7からはステータスバー領域も含めてsetBackgroundImage:に指定した画像が適用されるためステータスバー領域が黒く塗りつぶされていた。

setBackgroundImage: forBarPosition: barMetrics:の検証

iOS7用に setBackgroundImage: forBarPosition: barMetrics: メソッドが新しく使えるようになりforBarPosition:に指定するUIBarPositionを適切に設定することで背景がステータスバー領域の上まで延びて表示されるようになるとドキュメントに記載されていたので試してみた。

しかしどれも変わらずステータスバー領域が黒く塗りつぶされたまま。。

UIBarPositionBottomを指定した場合には画像を認識してくれなかった。

対応方法

結局のところ素直にUINavigaitonBarに設定する画像の高さをステータスバー領域も含めた64ptの画像を作成してOSのバージョンによってsetBackgroundImage: forBarMetrics:メソッドで指定する画像を切り替えて対応した。

NSString *headerImageName = @"header-64";
//iOS6以下である場合は高さ44ptの画像を設定
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f) {
    headerImageName = @"header-44";
}
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:headerImageName] forBarMetrics:UIBarMetricsDefault];

f:id:hachinobu:20140417140538p:plain