【发布时间】:2018-10-16 07:34:45
【问题描述】:
当需要让全屏AVPlayer 在仅纵向应用程序中支持横向方向时,最普遍的建议是添加AVFullScreenViewController 作为例外并使其支持横向方向。例如,在您的 AppDelegate 中添加此类名称与 supportedInterfaceOrientations(for:) 方法的比较。
但是,它从来没有为我工作过(尽管我只在 iOS 11 中检查过它),我不得不为我的 UIViewController 子类添加这样的例外,其中包含视频作为子视图。 (在我的例子中,为了让这个视图控制器在视频不是全屏时仅支持纵向模式,并在视频全屏时支持纵向和陆地空间方向。)
令人惊讶的是,它在 iOS 12 中不起作用。一项小型研究发现,Apple 在内部更改了 AVKit 中的全屏呈现机制。 (避免使用内部 API 的明显标志。)
以前版本的视图层次结构基于包含UITransitionView 的UIWindow 实例,同时您可以查看层次结构。 UITransitionView 持有 AVFullScreenViewController 实例。
(iOS11 screenshot)
iOS 12 版本的视图层次结构看起来非常不同:这次是两个窗口。第一个是熟悉的UIWindow,它包含您的视图层次结构。第二个对我来说是新的——AVWindow 实例,其中包含 UITransitionView 和 AVFullScreenViewController 和一个 UIViewController 不确定的子类作为兄弟。
(iOS12 screenshot)
当我尝试旋转屏幕时,AVFullScreenViewController 和未知的 UIViewController 子类都会调用 supportedInterfaceOrientations 方法。 (更准确地说,我不能确定 supportedInterfaceOrientations 是否被称为 UIViewController 子类,但很可能是这样。)
那么,还有其他人遇到过这个问题吗?是否有解决方案或变通方法?
提前感谢您的参与!
附:很抱歉画了我的内部类名,这个截图来自我公司的项目。
P.P.S.现在,我最终在 AppDelegate 中支持窗口的所有方向,并在每个视图控制器子类中覆盖 supportedInterfaceOrientations 以仅支持纵向。
【问题讨论】:
标签: ios cocoa-touch uikit avkit