iPad方向变化问题

7
我的 iPhone 应用程序在 iPad 上运行时显示了一些奇怪的行为,涉及支持方向变化的问题。
该应用程序启动时带有一个视图控制器(称其为视图 A),以及导航控制器,并且 shouldAutorotateToInterfaceOrientation 仅返回肖像模式。然后,我将另一个视图控制器(视图 B)推到导航控制器上,它也仅返回肖像模式。接下来,我将另一个支持所有旋转并根据要旋转的方向调整屏幕上项目的视图控制器(视图 C)推到导航控制器上。
当在 iPhone 模拟器和设备上运行时,如果您在视图 C 上旋转到横向,然后点击返回按钮返回到视图 B,则会执行正确的操作,并将视图 B 切换回纵向模式。(在模拟器上,它甚至会自动将模拟器旋转回纵向。)
我遇到的问题是,在 iPad 模拟器和设备上执行完全相同的事件序列时,出现的视图 B 没有旋转回纵向,导航控制器仍显示视图 C 的信息。然后,我点击返回按钮,视图保持不变,但导航控制器显示视图 B 的正常状态(但仍处于横向模式)。然后,如果我再次点击返回按钮,视图 A 就会出现在视图 B 的导航栏项目下面,最后再次点击返回按钮将我放在视图 A 上,带有导航栏 A 项目。
如果我在 iPad 上转到视图 B 并开始旋转,则 shouldAutorotateToInterfaceOrientation 会发出 NO,直到我达到纵向模式,然后一切恢复正常。
该应用程序使用 iPhone SDK 的最新发布版本构建,并具有以下构建设置:iPhone 模拟器 4.0 的基本 SDK,iPhone 的目标设备系列,iPhone OS 3.1.3 的 iPhone OS 部署目标。
有任何想法吗?

我在这里遇到了完全相同的问题,我相信这是iOS3.2中的一个错误。在我的iPhone(3.1.2和4.0)上,一切都正常。可惜的是,没有(记录的)函数可以手动更改方向。让我们看看其他人在这里有什么说法... - cocoapriest
2个回答

4

苹果公司声明:

问题:您的UITabBarController或UINavigationController中的所有子视图控制器没有共同的方向设置。

解决方案:为了确保所有子视图控制器正确旋转,您必须为每个表示每个选项卡或导航级别的视图控制器实现shouldAutorotateToInterfaceOrientation。每个视图控制器必须就相同的方向达成一致,才能进行旋转。也就是说,它们都应该返回相同方向位置的YES。

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

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


那不是问题,请仔细阅读问题。iPhone和iPad在处理这个问题时有很大的区别... - cocoapriest
我明白这个问题,我只是在传达苹果的指导 :) 如果您觉得这是模拟器中的一个 bug,请向 Apple 提交一个 radar。很多人使用具有方向性的导航控制器,但是尽管 3.2 已经发布很长一段时间了,我似乎找不到其他人有同样的问题的任何信息。 - iwasrobbed
2
我认为这适用于您的情况。您的视图C支持所有方向,而A和B仅支持纵向。苹果的QA1688说,在UINavigationController下的所有子视图控制器都必须同意一组评论方向。我在这个问题中也遇到了同样的问题(vc不同意方向)。 - progrmr
shouldAutorotateToInterfaceOrientation在iOS6中已被弃用。 - shim

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];
}

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

第一个设置变换类型(身份),第二个执行变换。同时,shouldAutoRotateToInterfaceOrientation表示如果设备处于该方向,则旋转。如果设备处于横向,则界面不会旋转,除非它处于纵向。我提交的代码是针对iPhone(320和480)的,但如果设备的方向是横向,则视图看起来像是纵向,使用户需要将设备倾斜以将其设置为纵向(反之亦然)。 - David Skrundz
我同意progrmr的观点:您不应该需要两次分配转换属性。由于您没有执行任何操作,因此将简单地忽略第一次分配。CGAffineTransformMakeRotation没有返回值,仅表示添加了旋转的标识变换。 - Raphael Schweikert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接