当需要在全屏肖像应用中使全屏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
以仅支持纵向。
答案 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启用的“基于视图控制器的状态栏外观” =是,但可能不相关