【问题标题】:Play AVKit fullscreen videos in landscape in fully portrait app, iOS 12 edition在 iOS 12 版全纵向应用中以横向播放 AVKit 全屏视频
【发布时间】: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 以仅支持纵向。

【问题讨论】:

    标签: ios cocoa-touch uikit avkit


    【解决方案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,但可能不相关

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-21
      • 2014-11-21
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多