モーダルViewControllerのようにpresentという用語を使用しているため、質問はやや混乱しますが、別のソリューションを作成する包含についても言及しています。
それはすべてあなたのアプリに本当に依存します。ViewControllersの一方のブランチがポートレートのみで、もう一方のブランチがランドスケープのみの場合、2つを切り替える瞬間のため、封じ込めの使用はおそらく困難になります。オリエンテーションの呼び出しは親から子に渡されますが、ローテーションが発生したときにのみ呼び出されます。たとえば、携帯電話が縦向きで縦向きのVCを表示している場合、横向きのVCに切り替えると縦向きで表示され、デバイスを回転させると、オリエンテーションコールによって横向きになり、元に戻らないようになります。肖像画に。同じことが逆になります。デバイスに各ViewControllerのすべての方向コールバックを強制的に実行させて回転を強制するトリックがありますが、すべてのiOSバージョンで機能するかどうかはわかりません。rootViewControllerのビューをそのスーパービュー(ウィンドウ)から削除し、すぐに再度追加すると、オリエンテーションコールバックがトリガーされます。したがって、子ViewControllerを切り替えるたびにそれを試みることができます。
または、包含を使用する代わりに、ポートレートVCをrootViewControllerとして使用し、ランドスケープViewControllerを作成して、メモリに残るようにどこかに保存することもできます。ランドスケープViewControllerを表示する必要がある場合は、rootViewControllerでモーダルに表示します。自動回転方法が正しく設定されている場合、ステータスバーの方向が変更され、VCが正しい方向で表示されます。それを閉じると、向きは縦向きに戻ります。
編集:
ここにはXcodeはありませんが、メモ帳にすばやく入力しました。これは機能するはずです。この場合、トランジションなしで、デバイスの向きを強制的に切り替えます。アニメーションを使用する場合は、_landscapeVCのmodalTransitionStyleプロパティを確認してください。
// In AppDelegate.h
PortraitViewController* _portraitVC;
LandscapeViewController* _landscapeVC;
// In AppDelegate.m
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
_portraitVC = [[PortraitViewController alloc] init];
_landscapeVC = [[LandscapeViewController alloc] init];
self.window.rootViewController = _portraitVC;
[self.window makeKeyAndVisible];
}
-(void)showLandscape
{
[_portraitVC presentViewController:_landscapeVC animated:NO completion:^{}];
[UIApplication sharedApplication].statusBarOrientation = _landscapeVC.interfaceOrientation;
}
-(void)showPortrait
{
[_landscapeVC dismissViewControllerAnimated:NO completion:^{}];
[UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait;
}