iOS8:当手机旋转到横向时如何显示不同的视图控制器?

Posted

技术标签:

【中文标题】iOS8:当手机旋转到横向时如何显示不同的视图控制器?【英文标题】:iOS8: How to show a different view controller when the phone rotates to landscape? 【发布时间】:2015-02-23 22:42:32 【问题描述】:

我有一个仅纵向的视图控制器。当我旋转手机时,我想显示第二个仅横向视图控制器。我怎样才能让它在 ios 8 上运行?

在 iOS 7 下,一切正常:我监听 UIDeviceOrientationDidChangeNotification,然后在第一个显示横向视图控制器。我使用复制原生旋转动画的自定义动画控制器。我为transform 属性设置动画以将视图旋转到位,然后调用setStatusBarOrientation:animated: 来更新系统。

在 iOS8 上,视觉效果正常,但旋转后触摸处理在屏幕的右半部分被破坏。事实上,在粉红色区域的任何地方收到的任何触摸都会映射到x = 414。所以触摸注册,但分配了不正确的x 坐标。

这似乎与here 描述的问题相同,该人描述了仅在纵向窗口框架边缘周围的小条上接收触摸。这似乎也与this problem 有关。

问题似乎是底层 UIWindow 没有通过调用 setStatusBarOrientation:animated: 来旋转。在调试器中查看它,我看到调用此函数将 UIDevice 边界更改为横向,但 UIWindow 边界保持纵向。

根据docs

窗口的两个主要功能是提供一个显示其视图的区域并将事件分发到视图。

所以这个触摸分配功能似乎被破坏了。

谁能建议一种在 iOS 8 中让它工作的方法?不管新的尺寸类和 UITraitCollection 的东西如何,我仍然应该能够对视图应用旋转变换,并且没有那种中断触摸处理。对?

或者,有没有一种更简单的方法可以将视图控制器呈现为横向,而无需手动实现动画?

【问题讨论】:

【参考方案1】:

尝试从您的应用委托代码中删除或注释掉以下行(如果存在):

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

您现在不需要它,它会影响 iOS8 上的旋转。

【讨论】:

感谢您的建议,但没有奏效。删除它只会使屏幕变黑。将其更改为 self.window = [UIWindow new] 会产生错误 unexpected nil window in _UIApplicationHandleEventFromQueueEvent 奇数。听起来您没有根控制器。你应该只需要self.window.rootViewController = <insert root controller>; self.window.backgroundColor = <insert color...>; [self.window makeKeyAndVisible]; 我回过头来提醒自己 self.window 行在 iOS8 上的代码中的效果,我得到了您正在体验的效果。硬件旋转,但内部控制器不接收旋转并且屏幕的右手停止接收输入。我使用- (void) willAnimateRotationToInterfaceOrientation:duration: 来处理旋转变化。我很确定您的问题与不需要创建 self.window 有关。你能发布你的didFinishLaunchingWithOptions: 方法吗? 还发现如果情节提要没有将其中一个视图控制器标记为初始视图控制器,则会出现黑屏并删除该行。这也许是刺激 xcode 正确创建内部 self.window 的原因。【参考方案2】:

我认为这是 iOS 8 的错误,我发现它已在 ios 8.3 中修复

【讨论】:

以上是关于iOS8:当手机旋转到横向时如何显示不同的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将视图从纵向模式旋转到横向模式

如何在控制设备方向的同时控制设备状态栏的方向?

设备旋转时切换视图控制器

UIWindow 的根视图控制器在应用启动时不会旋转到横向

整个应用程序的一个横向视图

可以在旋转时自动调整视图的大小以尽可能大吗?