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"
-
この組合わせになる方向しか画面の向きの変更は許可されない。