在 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 的明显标志。)

以前版本的视图层次结构基于包含UITransitionViewUIWindow 实例,同时您可以查看层次结构。 UITransitionView 持有 AVFullScreenViewController 实例。 (iOS11 screenshot)

iOS 12 版本的视图层次结构看起来非常不同:这次是两个窗口。第一个是熟悉的UIWindow,它包含您的视图层次结构。第二个对我来说是新的——AVWindow 实例,其中包含 UITransitionViewAVFullScreenViewController 和一个 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 视频

尝试在 iOS 8 中以横向模式而不是纵向模式显示键盘

在 phonegap 应用程序中以编程方式设置纵向或横向

在 ios6 和 ios7 的 MPMoviePlayerViewController 中将横向旋转为纵向

如何在 Android WebView 中以横向全屏播放视频?

如何在仅纵向应用程序中使用 MPMovieViewController 播放横向视频