Form Sheetの画面回転処理

あるViewControllerから別のViewControllerをモーダルで呼び出すときにform sheetという表示方法がある。このform sheetというのは画面全体を覆うのではなく"回"のように中央に小さなViewを表示するタイプ。

この呼びだされたもの自体もViewControllerなので、デバイス回転に対するメソッドを持つことが出来るが、form sheetの場合はその回転メソッドは無視して、呼び出し(親)の向きに従うようである。

iOS View Controllerプログラミングガイドにこう書かれています。

画面全体を占めないView Controllerは一般に、向きを考慮しなくても構いません。親View Controllerか ら描画領域を指定されるので、その中に描画すればよいのです。一方、ルートView Controller(ある いは画面全体を表すView Controller)は、デバイスの向きを意識することが多いでしょう。

ということで「親View Controllerか ら描画領域を指定される」に「向き」も含まれていると解釈すれば、親ViewControllerに従うという理解で良さそうです。

ただ、iOS5とiOS6で挙動が若干違うようです。
記述してある対応画面が親コントローラと子コントローラで同じならばいいんですが、問題となるのはiOS5で違う場合の処理です。いろいろやってみたのですが、どうも法則がつかめず。

パターン1 親の対応方向が子の対応方向を含む
わからない
(例)
親コントローラ:全方向
子コントローラ:rightのみ
iOS5 親は回転に反応せず。子はrightのみ。
iOS6 親が全方向に対応し、それに子も従う
(例)
親コントローラ:全方向
子コントローラ:UpSideDownのみ
iOS5 親は回転に反応せず。子はUpSideDownのみ。
iOS6 親が全方向に対応し、それに子も従う
(例)
親コントローラ:全方向
子コントローラ:rightとUpSideDownのみ
iOS5 親も子もrightとUpSideDown。
iOS6 親が全方向に対応し、それに子も従う
(例)
親コントローラ:全方向
子コントローラ:portraitとUpSideDownのみ
iOS5 親も子もportraitとUpSideDown。
iOS6 親が全方向に対応し、それに子も従う
(例)
親コントローラ:全方向
子コントローラ:rightとleftのみ
iOS5 親も子もrightとleft。
iOS6 親が全方向に対応し、それに子も従う

パターン2 親と子の対応方向に同じものを持たない
(例)
親コントローラ:左右のみ
子コントローラ:PortraitとPortraitUpsideDownのみ
iOS5 子はPortraitのみ 親は回転に反応しない(子を呼び出した時点の向きを保持する)
iOS6 親が左右方向のみに対応し、それに子も従う

パターン3 子の対応方向が親の対応方向を含む
(例)
親コントローラ:Portraitのみ
子コントローラ:全方向
iOS5 親も子もPortraitのみ
iOS6 親がPortrait方向のみに対応し、それに子も従う

パターン4 親と子の対応方向で一部同じ物を持つが、両方共相手に無いものも持つ
(例)
親コントローラ:左右のみ
子コントローラ:PortraitとPortraitUpsideDownのみ
iOS5 子はPortraitのみ 親は回転に反応しない(子を呼び出した時点の向きを保持する)
iOS6 親が左右方向のみに対応し、それに子も従う

コメント