解決済み:
この問題を回避する唯一の方法は (私が知る限り)、自由に回転するビュー コントローラーを階層の外に出すことです。これを行う 1 つの方法は、自由に回転するコントローラーをアプリ デリゲート ルートコントローラーに一時的に割り当てることです。このように、回転しても階層の残りの部分は影響を受けません。
プッシュするコントローラーがあり、supportedInterfaceOrientations が適切に呼び出され、値が適切に返されます。縦向きを強制しています。ナビゲーターとタブ コントローラーをサブクラス化したので、関連するメソッドが正常に呼び出されます。実際、この1つの問題を除いて、すべてが完全に機能します:
縦向きのみをサポートする特定のコントローラーから、すべての向きをサポートする別のコントローラーをプッシュします。
この 2 番目のコントローラーで、デバイスを横向きに変更し、横向きモードでこのコントローラーをポップすると、次のようになります。
元のコントローラーでは、supportedInterfaceOrientations は正常に呼び出され (Autorotate が YES を返す必要があります)、以前と同じ向きの値 (縦向きのみ) が返されます。ただし、ポートレートのみを渡しますが、コントローラーのコンテンツはまだランドスケープです。
ブレークポイントを使用して、supportedInterfaceOrientations が毎回呼び出されることを確認しました。ただし、子コントローラーのランドスケープ コントローラーがポップされた場合、戻り値は適用されません。
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; を追加してみました。viewWillAppear に表示されますが、1) 機能しません。また、2) これでアプリが拒否されることはありませんか?
どうすればこの問題を解決できますか?
編集、ここにいくつかのコードがありますが、私の問題は非常に基本的です。
コントローラー 1 では、これらは常に呼び出されます。
-(BOOL)shouldAutorotate{
return NO;
///return YES; // does not matter
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
次に、ある時点で 2 番目のコントローラー (ビデオ プレーヤー) を押します。
[self presentModalViewController:playerController animated:YES];
コントローラ 2 で:
-(BOOL)shouldAutorotate{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
繰り返すステップ:
1) app を起動すると、コントローラ 1 がポートレート モードで表示されます。これはマスクが返されたためです。しかも回転しません。
2) コントローラー 2 を押します (またはモーダルで提示することもできます)。
3) これが回転します。横向きモードに回転します。
4) ポップコントローラー 2.
5) コントローラー 1 はランドスケープ モードになりますが、shouldAutorotate と supportedInterfaceOrientations が呼び出され、コントローラー 1 のコードに示すように値が返されます。