将旋转到 iOS 8 上未调用的界面方向

Posted

技术标签:

【中文标题】将旋转到 iOS 8 上未调用的界面方向【英文标题】:willRotateToInterfaceOrientation not called on iOS8 【发布时间】:2014-11-10 10:06:23 【问题描述】:

我在我的应用程序中使用VFR PDF viewer library,我在其中展示它:

ReaderDocument *document = [ReaderDocument withDocumentFilePath:pdfFile password:nil];
ReaderViewController *vc = [[ReaderViewController alloc] initWithReaderDocument:document];
[self.navigationController pushViewController:vc animated:YES];

如果我在 ios7 上运行,一切正常。

如果我在 iOS8 上运行我的应用程序,ReaderViewController 中的 willRotateToInterfaceOrientation 方法永远不会被调用,因此当设备旋转时,文档不会被正确地重新格式化。

但是,如果我在 iOS8 上运行库附带的演示应用程序,ReaderViewController 中的 willRotateToInterfaceOrientation 确实会被调用,这让我相信库没问题,我做错了什么(或忽略了做某事) 在我的应用中。

我对这种行为感到很困惑。为什么 willRotateToInterfaceOrientation 在 iOS8 上的我的应用程序中没有被调用,但在其他变体中却可以调用?我该如何尝试追踪?

【问题讨论】:

【参考方案1】:

我终于设法解决了我的问题;这就是问题所在,以防其他人遇到同样的问题。

我的ReaderViewController 是从实现viewWillTransitionToSize:withTransitionCoordinator: 的类中呈现的,因此不会调用子视图控制器上已弃用的方法。

在那个实现中它也没有调用

[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]

所以所有子视图控制器的viewWillTransitionToSize:withTransitionCoordinator: 方法也没有被调用。

解决方法是添加一个调用

[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]

进入父VC的viewWillTransitionToSize:withTransitionCoordinator:方法,子类ReaderViewController,然后在我的子类中添加一个viewWillTransitionToSize:withTransitionCoordinator:来调用ReaderViewController中的相应方法。

【讨论】:

当您设法解决问题时,您可以将自己的答案验证为已接受的答案,以便其他人知道它已解决。【参考方案2】:

仅仅因为willRotateToInterfaceOrientation在iOS8中不再被调用,它被弃用了。

如果没有实施新的轮换方法,而一个项目是 使用 iOS 8 SDK 编译,视图控制器 - 将不会收到 对已弃用的轮换方法的调用。

可以找到与您类似的问题here

@mluisbrown 的引用:

在 iOS 8 SDK 中不推荐使用旋转方法。这将有 对使用 iOS 7 SDK 构建的应用完全没有影响,即使在 iOS 中运行也是如此 8 和可能的几个未来版本的 iOS。

我遇到了与您类似的问题。我尝试按照 Apple 的建议使用 viewWillTransitionToSize,在我的情况下这并没有解决我的问题,因为这只会在从常规更改为紧凑时触发,例如不旋转。

viewWillTransitionToSize:withTransitionCoordinator: 使 基于界面的调整。

详情见apple documentation

还有一个WWDC 2014 的视频解释了这一点,但我不记得是哪个视频了。也许What's new in Cocoa touch 上的那个或View Controller Advancements in iOS 8 上的那个。

编辑

请注意,在我的例子中,viewWillTransitionToSize 没有被调用,正如解释的那样,因为我没有从常规更改为紧凑,因此严格来说对于 Apple 来说没有大小转换。

我找到的唯一解决方案是在相应视图控制器的viewDidLayoutSubviews 中手动处理此问题。

在我的例子中,我想使用自动布局跟踪表格视图中显示的顶部单元格。由于系统没有自动跟踪它,我不得不手动检查并手动滚动到旋转的适当单元格。这就是我这样做的原因。它很“重”,但在我的情况下有效。

如果有人有更简单的解决方案,我也很感兴趣。

【讨论】:

我在 ReaderViewController 类中添加了一个 viewWillTransitionToSize:withTransitionCoordinator: 方法,并且在设备旋转时也不会调用该方法。除了添加那个方法,我还需要做什么吗? 旋转并不完全是尺寸转换。 Apple假设它是一个,以防您在横向或纵向中从紧凑型变为常规尺寸。在我的情况下,为了检测旋转,我必须在指定控制器的 viewDidAppear 中手动处理该行为。不幸的是,我没有发现任何其他简单的方法。 现在我更加困惑了! viewDidAppear 仅在视图出现时调用,而不是在设备旋转时调用,所以我不明白你如何处理那里的行为。 对不起,我没记错。我必须使用 viewDidLayoutSubviews 让它正常工作。正如你所说, viewDidAppear 只被调用一次。 还有一点。当您尝试 viewWillTransitionToSize 时,您是在 appdelegate 中尝试还是直接在 viewcontroller 中尝试。因为我在我的代码中看到我也在我的 viewController 中使用了 viewWillTransitionToSize。我假设它是为了处理大小变化,但旋转由 viewDidLayoutSubviews 处理

以上是关于将旋转到 iOS 8 上未调用的界面方向的主要内容,如果未能解决你的问题,请参考以下文章

如何将视图初始化为界面方向?

iOS 8 自动旋转将图像旋转到屏幕外

如何在 iOS 中以圆形方向旋转 UIButtons?

iOS学习笔记— 屏幕旋转

iOS 8 自定义键盘方向更改

iOS App:窗口旋转总是纵向而不是横向