通話中の画面サイズ

iPhoneには通話中やテザリング中にステータスバーの高さが2倍になる仕様があります。 この時、狭められた分のviewのサイズはどうなっているか調べてみました。

基本的な考え方

まずiOS7の場合viewは通常画面の一番上から始まるので、透過したステータスバーと20px分重なっているのが通常状態です。

通話中などにステータスバーが2倍の40pxになると、20px重なっている分は変わらず、さらに20px分viewが縮められます。

ではこれを元にいくつかのパターンを見てみます。

普通のviewの場合

まず普通のviewの場合、基本的な考え方の通り、ステータスバーが2倍になるとyが+20され、heightが-20されます。 (画像中の数字は{{x,y},{width,height}}) 通話中はステータスバーが透過しなくなるため一番上のグレーのバーがステータスバーの下に潜り込んで見えなくなっています。

f:id:y_310:20140416204847p:plain f:id:y_310:20140416204859p:plain

UINavigationControllerの場合

UINavigationControllerの中のviewの場合はheightのみ-20されます。親のviewに対する起点は変わってないので当然ですね。

f:id:y_310:20140416204906p:plain f:id:y_310:20140416204911p:plain

ChildViewControllerの場合

以下のようにchildViewControllerを2つセットした画面で試してみます。1つ目はUINavigationController、2つ目はただのViewControllerです。

f:id:y_310:20140416210840p:plain

親のviewは基本通りy+20, height-20で、赤いただのViewControllerをセットしたChild ViewControllerは特に変化していません。 ここまではいいのですが、なぜか1つ目のUINavigationControllerをセットしたところだけheightが-20されています。

f:id:y_310:20140416204914p:plain f:id:y_310:20140416204917p:plain

この挙動は使う側としてはあまり期待していない挙動だと思うのですが、もしかするとステータスバーの高さが変わった時にUINavigationControllerの高さを問答無用で20px縮める処理がどこかにあるのかもしれません。

原因はautoresizingMaskの設定でした。UINavigationController側のContainer Viewだけ以下の様な設定になっていて高さがリサイズされていました。

f:id:y_310:20140421225406p:plain

このようにUIViewAutoresizingFlexibleHeightを外してやると高さが変わらなくなって期待通りの挙動になりました。

f:id:y_310:20140421225418p:plain

今回の検証に使ったコードはこちらにあります。 https://github.com/y310/StatusBarExample