【问题标题】:iPad orientation change issueiPad方向改变问题
【发布时间】:2011-03-13 22:27:01
【问题描述】:

我的 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 部署目标。

有什么想法吗?

【问题讨论】:

  • 我这里有完全相同的问题,我相信这是iOS3.2中的一个错误。在我的 iPhone(3.1.2 和 4.0)上,一切都应如此。可悲的是,没有(记录在案的)功能可以手动更改方向。让我们看看其他人在这里要说什么......

标签: iphone ipad uiinterfaceorientation


【解决方案1】:

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

- (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),但如果设备的方向是横向,则视图看起来像纵向,使用户倾斜设备以将其设置为纵向(反之亦然)。
  • 我同意 progrmr:您不需要分配转换属性两次。第一个分配将被忽略,因为你没有对它做任何事情。 CGAffineTransformMakeRotation 只返回一个旋转,这意味着带有旋转的身份转换。
【解决方案2】:

苹果声明:

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

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

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

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

【讨论】:

  • 这不是问题。请仔细阅读问题。 iPhone 和 iPad 之间存在真正的区别,它们如何处理这个问题......
  • 我明白这个问题,我只是传递苹果的指导 :) 如果你觉得这是模拟器中的一个错误,你应该向苹果提交一份雷达报告。很多人使用带方向的导航控制器,但即使 3.2 已经发布了很长时间,我似乎也找不到其他人遇到同样问题的任何信息。
  • 我认为这确实适用于您的情况。您的视图 C 支持所有方向,而 A 和 B 仅支持纵向。 Apple 的 QA1688 表示 UINavigationController 下的所有子视图控制器必须就一组方向的注释达成一致。我在this question 中遇到了同样的问题(vc 在方向上没有达成一致)。
  • shouldAutorotateToInterfaceOrientation 在 iOS6 中已弃用
猜你喜欢
  • 2013-03-14
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 2014-07-13
相关资源
最近更新 更多