この質問は、iOSデバイスの回転とUINavigationControllerの複数の制御されたビューに関するものです。一部のビューは縦向きに制限する必要があり、一部は自由に自動回転する必要があります。3つのビューを使用して最も単純なセットアップを作成しようとすると、自動回転の動作にいくつかの非常に厄介な癖があることに気付くでしょう。ただし、シナリオは非常に単純なので、自動ローテーションの実装が正しく行われていないか、何かを忘れていると思います。
私は奇妙さを示す非常に基本的なデモアプリを持っていて、それが実際に動作していることを示すビデオを作成しました。
セットアップは非常に基本的です。3つのViewControllerは、と呼ばれ、FirstViewController
すべてがクラス名のラベルを表示し、デバイスが縦向きの場合にYESを返すを拡張します。SecondViewControllerは、このメソッドをオーバーライドして、すべての回転を許可します。3つの具象クラスはすべて、いくつかの色付きの正方形を追加して、コントローラーをオン/オフすることでビュー間を移動できるようにします。これまでのところ、非常に単純なシナリオだと思います。SecondViewController
ThirdViewController
AbstractViewController
shouldAutorotateToInterfaceOrientation:
UINavigationController
デバイスを縦向きまたは横向きに持っている場合、これは私が達成したいだけでなく、期待する結果です。最初の画像では、すべてのビューが「直立」していることがわかります。2番目の画像では、2番目のビューコントローラーのみがデバイスの向きを逆回転させていることがわかります。明確にするために、横向きモードの2番目のビューから3番目のビューに移動できるはずですが、その3番目は縦向きのみをサポートしているため、縦向きでのみ表示する必要があります。結果に問題がないかどうかを確認する最も簡単な方法は、キャリアバーの位置を確認することです。
しかし、実際の結果は完全に異なるため、この質問はここにあります。デバイスを回転させたときに表示されているビューに応じて、また次に移動するビューに応じて、ビューは回転しません(具体的には、didOrientFromInterfaceOrientation:
メソッドが呼び出されることはありません)。2番目の風景にいて、3番目に移動すると、2番目と同じ向きになります(=悪い)。ただし、2番目から最初に戻ると、画面が「強制」ポートレートモードに回転し、持ち方に関係なく、キャリアバーがデバイスの物理的な上部に表示されます。ビデオはこれをより詳細に示しています。
私の質問は2つあります:
- 最初のViewControllerが回転して戻るのに、3番目は回転しないのはなぜですか?
- 一部のビューのみを自動回転させ、他のビューは自動回転させたくない場合に、ビューから正しい動作を取得するには、何をする必要がありますか?
乾杯、EP。
編集:賞金をかける前の最後の手段として、私はこの質問を完全に書き直して、より短く、より明確に、そしてうまくいけば、答えを与えるためにより魅力的にしました。