3

iOS 6 中对自动旋转的更改似乎使这变得异常困难或不可能。他们似乎在推动子视图控制器不应该覆盖其父视图控制器的自动旋转行为的理念。这使得我很难完成我想做的事情:

  • 我有一个必须显示纵向的视图控制器。
  • 它以模态方式推动另一个视图控制器,它是一个简单的图像查看器,但我希望这个视图控制器能够旋转到任何纵向或横向(原因很明显)
  • 当子视图控制器被解除(不管其当前方向如何)时,父视图控制器应保持纵向

UIViewController 类参考中的相关 Apple 文档

在 iOS 6 中,您的应用支持在应用的 Info.plist 文件中定义的界面方向。视图控制器可以覆盖supportedInterfaceOrientations 方法来限制支持的方向列表。一般情况下,系统只会在窗口的根视图控制器或呈现为填满整个屏幕的视图控制器上调用该方法;子视图控制器使用其父视图控制器为它们提供的窗口部分,并且不再直接参与有关支持哪些旋转的决策。应用程序的方向掩码和视图控制器的方向掩码的交集用于确定视图控制器可以旋转到哪些方向。

我曾考虑过使用变换来模拟子视图控制器中的旋转,但老实说,我觉得应该有更好的方法,如果可能的话,我想避免这种情况

似乎为了让任何子视图控制器支持界面方向,它的父视图控制器(以模态或其他方式呈现)现在也必须支持该界面方向。

我在这里错过了一些简单的东西吗?这是否像看起来那样荒谬?

4

2 回答 2

2

您可以继承导航控制器并覆盖该(NSUInteger)supportedInterfaceOrientations方法。因此,导航控制器将始终返回当前显示的视图控制器支持的任何内容。

如下所示(代码和想法未经测试):

- (NSUInteger)supportedInterfaceOrientations {
    return [self.presentedViewController supportedInterfaceOrientations];
}
于 2012-10-06T01:35:28.040 回答
2

我今天正在处理类似的问题并解决了这个问题:

在父视图中,我检查是否分配了孩子(因此在我的案例中显示)。如果是,则代码允许任何方向,如果不是,则仅横向。就像是:

父母中:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    bool result;

    if (self.photoViewController)
    {
        result = YES;
    }
    else
    {
        result = (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }

    return result;
}

- (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger result;

    if (self.photoViewController)
    {
        result = UIInterfaceOrientationMaskAll;
    }
    else
    {
        result = UIInterfaceOrientationMaskLandscapeLeft+UIInterfaceOrientationMaskLandscapeRight;
    }

    return result;
}

孩子这个功能看起来有点不同:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

这让我遇到了您在对Robotic Cat 的回答的评论中提到的同样的问题:当孩子被解雇时,父视图控制器可以发现它自己的方向错误。

此代码(感谢Corey Floyd 的代码片段)强制父母重新定向。

UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

它应该放在子视图控制器被删除的位置之后。这是为 iOS 6.0 编写的,您也可以使用原始链接中的代码。

于 2012-10-09T00:47:03.417 回答