通話中の画面サイズ
iPhoneには通話中やテザリング中にステータスバーの高さが2倍になる仕様があります。 この時、狭められた分のviewのサイズはどうなっているか調べてみました。
基本的な考え方
まずiOS7の場合viewは通常画面の一番上から始まるので、透過したステータスバーと20px分重なっているのが通常状態です。
通話中などにステータスバーが2倍の40pxになると、20px重なっている分は変わらず、さらに20px分viewが縮められます。
ではこれを元にいくつかのパターンを見てみます。
普通のviewの場合
まず普通のviewの場合、基本的な考え方の通り、ステータスバーが2倍になるとyが+20され、heightが-20されます。 (画像中の数字は{{x,y},{width,height}}) 通話中はステータスバーが透過しなくなるため一番上のグレーのバーがステータスバーの下に潜り込んで見えなくなっています。
UINavigationControllerの場合
UINavigationControllerの中のviewの場合はheightのみ-20されます。親のviewに対する起点は変わってないので当然ですね。
ChildViewControllerの場合
以下のようにchildViewControllerを2つセットした画面で試してみます。1つ目はUINavigationController、2つ目はただのViewControllerです。
親のviewは基本通りy+20, height-20で、赤いただのViewControllerをセットしたChild ViewControllerは特に変化していません。 ここまではいいのですが、なぜか1つ目のUINavigationControllerをセットしたところだけheightが-20されています。
この挙動は使う側としてはあまり期待していない挙動だと思うのですが、もしかするとステータスバーの高さが変わった時にUINavigationControllerの高さを問答無用で20px縮める処理がどこかにあるのかもしれません。
@y_310 最後のEmbeddedされたViewの高さが変わる件ですが、ViewのautoresizingMaskの設定次第だと思います。コードをダウンロードして見たみたところ上のViewだけUIViewAutoresizingFlexibleHeightが入ってました。
— 所 友太 (@tokorom) 2014, 4月 21
原因はautoresizingMaskの設定でした。UINavigationController側のContainer Viewだけ以下の様な設定になっていて高さがリサイズされていました。
このようにUIViewAutoresizingFlexibleHeightを外してやると高さが変わらなくなって期待通りの挙動になりました。
今回の検証に使ったコードはこちらにあります。 https://github.com/y310/StatusBarExample