您的问题有点令人困惑,因为您使用了“存在”一词,就像在模态 ViewController 中一样,但您还提到了会创建不同解决方案的包含。
这完全取决于您的应用程序。如果 ViewControllers 的一个分支只有纵向而另一个只有横向,那么使用包含可能会很困难,因为你在两者之间切换的那一刻。方向调用从父级传递给子级,但仅在发生旋转时才调用。因此,例如,您的手机处于纵向并且您正在查看纵向 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;
}