在iOS 12版本的全屏肖像应用中横向播放AVKit全屏视频

时间:2018-10-16 07:34:45

标签: ios cocoa-touch uikit avkit

当需要在全屏肖像应用中使全屏AVPlayer支持横向时,最普遍的建议是以某种方式添加AVFullScreenViewController作为例外,使其支持横向。例如,将此类名的比较添加到supportedInterfaceOrientations(for:)中的AppDelegate方法中。

但是,它对我没有用(尽管我仅在iOS 11中进行了检查),并且我必须为包含视频作为子视图的UIViewController子类添加此类例外。 (在我的情况下,要解决此问题,使视图控制器在视频不处于全屏状态时仅支持纵向模式,而在视频处于全屏状态时同时支持纵向和地面方向。)

令人惊讶的是,它在iOS 12中不起作用。一项小型研究发现,苹果内部改变了AVKit中的全屏显示机制。 (请注意避免使用内部API。)

视图层次结构的先前版本基于保存UIWindow的{​​{1}}实例,并行地,您可以查看视图层次结构。 UITransitionView拥有该UITransitionView实例。 (iOS11 screenshot

iOS 12版本的视图层次结构看起来非常不同:这次有两个窗口。第一个是熟悉的AVFullScreenViewController,用于保存您的视图层次结构。第二个对我来说是新的– UIWindow实例,其中包含AVWindow,其中包含UITransitionView,还有一个AVFullScreenViewController不确定子类作为同级。 (iOS12 screenshot

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

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

感谢您提前预约!

P.S。对不起,我在内部类名称上作了画,这些屏幕截图取自我的公司项目。

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

1 个答案:

答案 0 :(得分:0)

经过大量实验,此变通办法以某种方式对我有效@ 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启用的“基于视图控制器的状态栏外观” =是,但可能不相关