将旋转到 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 上未调用的界面方向的主要内容,如果未能解决你的问题,请参考以下文章