Viewの回転対応とTabBarViewController

スマートフォン特有の画面の回転への対応だが、iOSでのプログラミングは非常に簡単だ。

iOSはデバイス毎に画面の大きさと解像度は固定と想定してよいので※、Androidのような「レイアウト」オブジェクトにより画面のリサイズが必要無いため、単純なビューの回転だけであればビューコントローラ(UIViewControllerクラス)の"shouldAutoRotateTointerfaceOrientation"メソッドの戻り値を対応する回転位置に合わせてYESにするだけである。 (Androidのようにライフサイクルが遷移してActivityへの参照が無効になってしまうのを避けるコードを書く必要も無い。)

メソッドのパラメタ"toInterfaceOrientation"は許可する画面の向き(オリエンテーション)を定数で指定する。

    • UIInterfaceOrientationLandscapeLeft
    • UIInterfaceOrientationLandscapeRight
    • UIInterfaceOrientationPortrait
    • UIInterfaceOrientationPortraitUpsideDown

それぞれ上から「画面の左側にホームボタン」がある向き、「画面の右側にホームボタン」がある向き、「通常の向き(ポートレイト)」、「(ポートレイトの)上下逆」を表しており、パラメタとの等式により向きの変更を許可する。


この例だとUIInterfaceOrientationLandscapeRightつまり、ホームボタンが右側にある状態しか許可しないので、結果として他の画面の向きにすることができなくなる。(デバイスの向きを変えても追従しなくなる、ということだ)

当然だが、同メソッドで無条件でYESを返すことで全ての向きに対応するようになる。

[ランドスケープで回転するiPhone シミュレータのビュー("コマンド"+"→|←"で時計|反時計回りにローテート)]

ただしこの方法には例外があり、注意が必要だ。

私が引っかかったことなのだが、TabBarViewControllerで複数のビューをタブバーで切替えるようなビューの構成にした場合、全てのビューに対応するビューコントローラが同shouldAutoRotateTointerfaceOrientationメソッドの戻り値をYESとして戻さないと向きの変更に対応しないのである。

例えばTabBarViewControllerにView-A、View-Bと二つのビューが集約されていたとすると、

      • View-A + AViewController の shouldAutoRotateTointerfaceOrientationの戻り値が"YES"
      • View-B + BViewController の shouldAutoRotateTointerfaceOrientationの戻り値が"YES"

この組合わせになる方向しか画面の向きの変更は許可されない。


iPhone/iPad、Retina/非Retinaの違いは意識しなくてはならないが、それはまた別な機会に紹介する