7

我的 iPhone 应用程序在 iPad 上运行时显示一些奇怪的行为,以支持方向更改。

该应用程序以视图控制器(为了参数而将其称为视图 A)和导航控制器启动,并且 shouldAutorotateToInterfaceOrientation 仅针对纵向返回 YES。在导航控制器上,我推送一个视图控制器(视图 B),该控制器也仅针对纵向返回 YES。然后,我将另一个视图控制器(视图 C)推到支持所有旋转的导航控制器上,并根据要旋转到的方向调整屏幕上的项目。

当它在 iPhone 模拟器和设备上运行时,如果您在视图 C 上旋转到横向,然后点击后退按钮返回到视图 B,它会做正确的事情并将视图 B 切换回纵向模式。(在模拟器中,它甚至会自动将模拟器旋转回纵向。)

我遇到的问题是,当我在 iPad 模拟器和设备上执行完全相同的事件序列时,出现的视图 B 没有旋转回纵向,导航控制器仍然显示视图 C 的信息。然后,我点击后退按钮,视图保持不变,但导航控制器显示视图 B 正常(但仍处于横向模式)。然后,如果我再次点击后退按钮,视图 A 会出现在视图 B 导航栏项目下,最后再次点击后退让我进入视图 A 和导航栏 A 项目。

如果我在 iPad 上查看 B 并开始旋转,shouldAutorotateToInterfaceOrientation 会以 NO 触发,直到我达到纵向模式,然后一切恢复正常。

该应用程序使用最新发布的 iPhone SDK 版本构建,构建设置如下:iPhone Simulator 4.0 的 Base SDK、iPhone 的目标设备系列、iPhone OS 3.1.3 的 iPhone OS 部署目标。

有任何想法吗?

4

2 回答 2

4

苹果表示:

案例:您的 UITabBarController 或 UINavigationController 中的所有子视图控制器不同意共同的方向集。

响应:为确保您的所有子视图控制器正确旋转,您必须为代表每个选项卡或导航级别的每个视图控制器实现 shouldAutorotateToInterfaceOrientation。每个人都必须同意相同的方向才能发生旋转。也就是说,对于相同的方向位置,它们都应该返回 YES。

http://developer.apple.com/iphone/library/qa/qa2010/qa1688.html

您可以在导航控制器中而不是在单个视图中设置设备方向。然后您可以检查堆栈中的哪个视图并根据结果进行旋转。这样,导航控制器也可以处理所有方向。

于 2010-07-13T16:41:36.927 回答
0

这是我用来防止该错误的一些代码:

- (void)viewDidLoad {  
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(M_PI/2);
        self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
    }
    [UIView commitAnimations];
}

- (void)viewDidLoad {
    if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(-(M_PI / 2));
        self.view.bounds = CGRectMake(0, 0, 320, 480);;
    }
    [UIView commitAnimations];
}

根据设备所处的方向,您将需要修改一些代码。

于 2010-07-15T23:45:12.833 回答