iOS - viewController包含和自动旋转

时间:2012-11-04 12:40:59

标签: iphone ios ipad uiviewcontroller

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

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

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

我今天有什么

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

如果我将rootViewController变为容器viewController,我会有这个

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

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

我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:0)

您的问题有点令人困惑,因为您使用术语存在,如在模态ViewController中,但您还提到了可以创建不同解决方案的包含。

这完全取决于你的应用程序。如果ViewControllers的一个分支只是纵向而另一个只有横向,那么使用包含可能会很困难,因为你在两者之间切换。方向调用从父级传递给子级,但只有在发生轮换时才会调用它们。因此,例如,您的手机处于纵向状态,并且您正在查看纵向VC,当您切换到横向VC时,它将以纵向显示,当您旋转设备时,定向调用将使其变为横向并防止其返回到肖像。反过来也是如此。 有一个技巧可以强制设备通过每个ViewController的所有方向回调,从而强制轮换,但我不确定它是否适用于每个iOS版本。您可以从其superview(窗口)中删除rootViewController的视图,并立即再次添加它,这将触发方向回调。因此,每次在子ViewControllers之间切换时都可以尝试这样做。

或者不使用包含,您可以使用纵向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;
}