0

我的应用程序支持两组 viewController,那些应该在纵向工作的和应该在横向工作的。

彼此呈现不同方向的视图控制器会导致错误的方向,所以有人建议我创建一个视图控制器包含主视图控制器(使所有方向都应该自动旋转)并从中添加两个视图控制器分支,一个用于纵向(使用 shouldAutorotate YES肖像)和一个用于风景(使用 shouldAutorotate YES 用于风景)。我的问题是:这行得通吗?我的意思是,每个分支上的每个 viewController 都会旋转到正确的方向吗?

另一个问题是:我的项目基于单视图 Xcode 模板。该模板创建一个 RootViewController 作为应用程序启动时显示的那个。我的问题是:为了使包含建议有效,我必须在容器 viewController 中转换这个 rootViewController,并且我必须将它拥有的所有代码移动到另一个视图控制器并在应用程序启动时呈现。我的意思是:

我今天有什么

  • 应用程序运行并显示 rootViewController。让我们称之为 vCA。

如果我将 rootViewController 设置为容器 viewController 我将拥有这个

  • 该应用程序运行并显示完全为空的 containerController,并且必须呈现旧的 vCA。

在我看来,这是一个愚蠢的解决方案,我的意思是,提供一个空的 containerController 并将调用 vCA?

我怎么做?

谢谢。

4

1 回答 1

0

您的问题有点令人困惑,因为您使用了“存在”一词,就像在模态 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;
}
于 2012-11-05T00:11:00.593 回答