我的iPhone应用程序在支持方向更改时在iPad上运行时会显示一些奇怪的行为。
应用程序以视图控制器(为了参数而称之为视图A)和导航控制器启动,并且shouldAutorotateToInterfaceOrientation仅为纵向返回YES。在导航控制器上,我推动一个视图控制器(视图B),它也仅为肖像返回YES。然后,我将另一个视图控制器(视图C)推送到支持所有旋转的导航控制器上,并根据要旋转的方向调整屏幕上的项目。
当在iPhone模拟器和设备上运行时,如果在视图C上旋转到横向,然后点击后退按钮返回到视图B,它会做正确的事情并将视图B切换回纵向模式。 (在模拟器中,它甚至可以自动将模拟器旋转回肖像。)
我遇到的问题是,当我在iPad模拟器和设备上执行完全相同的事件序列时,出现的视图B不会旋转回纵向,并且导航控制器仍然显示视图C的信息然后,我点击后退按钮,视图保持不变,但导航控制器显示视图B的正常(但所有仍处于横向模式)。然后,如果我再次点击后退按钮,视图B会出现在视图B导航栏项目下,最后再次点击后面会将我带到导航栏A项目的视图A.
如果我在iPad上查看B并开始旋转,那么应该在没有触发的情况下使用NO来触发,直到我达到纵向模式,然后全部恢复正常。
该应用程序使用最新发布的iPhone SDK版本构建,并具有如下构建设置:iPhone模拟器4.0的基本SDK,iPhone的目标设备系列,iPhone OS 3.1.3的iPhone OS部署目标。< / p>
有什么想法吗?
答案 0 :(得分:4)
案例:UITabBarController或UINavigationController中的所有子视图控制器都不同意公共方向集。
响应:要确保所有子视图控制器正确旋转,必须为表示每个选项卡或导航级别的每个视图控制器实现shouldAutorotateToInterfaceOrientation。每个人必须就旋转发生的方向达成一致。也就是说,对于相同的方向位置,它们都应该返回YES。
http://developer.apple.com/iphone/library/qa/qa2010/qa1688.html
您可以在导航控制器中设置设备方向,而不是在单个视图中设置。然后,您可以检查堆栈中的哪个视图并根据结果进行旋转。通过这种方式,导航控制器也可以处理所有方向。
答案 1 :(得分: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];
}
根据设备的方向,您需要修改部分代码。