最近、コードを iPhone アプリから iPad に移植するときに問題が発生しました。ここで説明されている問題に関連している可能性がありますが、その質問の説明/解決策は不十分であることがわかりました. シナリオは次のとおりです。
ビュー コントローラー 'A' (ルート ビュー コントローラー) は、モーダル ビュー コントローラー ('B' と呼びます) を "フォーム シート" モーダル プレゼンテーション スタイルで表示します。
ビュー コントローラー B は、ビュー コントローラー 'C' を "フル スクリーン" モーダル プレゼンテーション スタイルで表示します。
ビュー コントローラー C が一番上に表示されているビュー コントローラーである間に、iPad が回転します。
C を閉じると、B が再表示されますが、向きが正しくありません。
私が知る限り、提示された複数のView Controllerの連鎖に問題はないはずです。実際、この動作はPresenting View Controllers from Other View Controllersのドキュメントで明示的にサポートされています。また、 iOS 5 リリース ノートの次のステートメントも読みました。
iOS 5 の回転コールバックは、全画面表示されるビュー コントローラーには適用されません。これが意味することは、コードが別のView Controllerの上にView Controllerを提示し、その後ユーザーがデバイスを別の方向に回転させた場合、却下時に、基礎となるコントローラー(つまり、提示するコントローラー)は回転コールバックを受信しないということです。ただし、表示中のコントローラーは、再表示時に viewWillLayoutSubviews 呼び出しを受け取り、このメソッドから interfaceOrientation プロパティを照会して、コントローラーを正しくレイアウトするために使用できることに注意してください。
私が知る限り、これは発生しません-ビューコントローラーBは-shouldAutoRotateToInterfaceOrientationへの呼び出しを受け取りますが、この呼び出しのinterfaceOrientationパラメーターの値は、値ではなく、ビューコントローラーCを提示したときのビューコントローラーBのインターフェイスの向きの値です却下時の C のインターフェイスの向き。iPad を使用しているため、これらすべてのビュー コントローラーは -shouldAutoRotateToInterfaceOrientation で YES を返します。したがって、B のビューの境界は変更されないため、-willLayoutSubviews は呼び出されません。
Bが閉じる前にBへのコールバックでView Controller Cの向きを保存し、次にその情報を使用して-shouldAutoRotateToInterfaceOrientationが呼び出され、Cの向きが閉じられたときにのみYESを返すようにしました。これにより、このチェックを行わずに表示される壊れた UI が修正されますが、ビュー コントローラー B はインターフェイスの向きをこの値に更新しないため、後続のモーダル プレゼンテーションはデバイスの間違った側からイン/アウトしてアニメーション化されます。
このようなView Controller構成を正常に取得できた人はいますか? それほど珍しいシナリオではないように見えるので、最初に期待したように機能していないことに少し驚いています。
前もって感謝します。