在 iOS 12 版全纵向应用中以横向播放 AVKit 全屏视频
Posted
技术标签:
【中文标题】在 iOS 12 版全纵向应用中以横向播放 AVKit 全屏视频【英文标题】:Play AVKit fullscreen videos in landscape in fully portrait app, iOS 12 edition 【发布时间】: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
以仅支持纵向。
【问题讨论】:
【参考方案1】:经过大量实验,这种解决方法对我有用@appdelegate.m
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
// play-video-then-back fix
if (@available(iOS 12, *))
// not key-window, allow anti-rotate, while keywindow rotate
if (window.isKeyWindow != YES)
return UIInterfaceOrientationMaskAll;
...
编辑:也启用 .plist “查看基于控制器的状态栏外观”= YES,但可能不相关
【讨论】:
以上是关于在 iOS 12 版全纵向应用中以横向播放 AVKit 全屏视频的主要内容,如果未能解决你的问题,请参考以下文章
IOS6 横向在仅纵向 iPhone 应用程序中从 uiwebview 播放嵌入的 youtube 视频
在 ios6 和 ios7 的 MPMoviePlayerViewController 中将横向旋转为纵向