首页 > 解决方案 > 在 iOS 12 版全纵向应用程序中以横向播放 AVKit 全屏视频

问题描述

当需要在仅纵向应用程序中使全屏AVPlayer支持横向方向时,最普遍的建议是添加AVFullScreenViewController某种方式作为例外并使其支持横向方向。例如,将此类名称添加到supportedInterfaceOrientations(for:)您的AppDelegate.

但是,它对我从来没有用过(尽管我只在 iOS 11 中检查过它),我不得不为UIViewController包含视频作为子视图的子类添加这样的异常。(在我的例子中,为了让这个视图控制器在视频不是全屏时只支持纵向模式,并在视频全屏时支持纵向和陆地空间方向。)

令人惊讶的是,它在 iOS 12 中不起作用。一项小型研究发现,Apple 在内部更改了 AVKit 中的全屏演示机制。(避免使用内部 API 的明显标志。)

以前版本的视图层次结构基于UIWindow持有的实例,UITransitionView并且您可以并行地查看层次结构。UITransitionView持有该AVFullScreenViewController实例。(iOS11截图

iOS 12 版本的视图层次结构看起来非常不同:这次是两个窗口。第一个是熟悉UIWindow的,它包含您的视图层次结构。第二个对我来说是新的 -AVWindow实例在其中包含UITransitionViewAVFullScreenViewController一个UIViewController不确定的子类作为兄弟。(iOS12截图

当我尝试旋转屏幕时supportedInterfaceOrientations,会同时调用AVFullScreenViewController未知UIViewController子类的方法。(更准确地说,我不能确定supportedInterfaceOrientations该子类是否准确地调用了它UIViewController,但很可能是这样。)

那么,还有其他人遇到过这个问题吗?有解决方案或解决方法吗?

感谢您提前参与!

PS我很抱歉画了我的内部类名,这个截图来自我公司的项目。

PPS 现在我最终支持我的窗口的所有方向,AppDelegate并在每个视图控制器子类中覆盖supportedInterfaceOrientations以仅支持纵向。

标签: ioscocoa-touchuikitavkit

解决方案


经过大量实验,这种解决方法以某种方式对我有用@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-enabled“查看基于控制器的状态栏外观”=是,但可能不相关


推荐阅读