ios - 在 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
实例在其中包含UITransitionView
和AVFullScreenViewController
一个UIViewController
不确定的子类作为兄弟。(iOS12截图)
当我尝试旋转屏幕时supportedInterfaceOrientations
,会同时调用AVFullScreenViewController
未知UIViewController
子类的方法。(更准确地说,我不能确定supportedInterfaceOrientations
该子类是否准确地调用了它UIViewController
,但很可能是这样。)
那么,还有其他人遇到过这个问题吗?有解决方案或解决方法吗?
感谢您提前参与!
PS我很抱歉画了我的内部类名,这个截图来自我公司的项目。
PPS 现在我最终支持我的窗口的所有方向,AppDelegate
并在每个视图控制器子类中覆盖supportedInterfaceOrientations
以仅支持纵向。
解决方案
经过大量实验,这种解决方法以某种方式对我有用@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“查看基于控制器的状态栏外观”=是,但可能不相关
推荐阅读
- php - Add button is used to display dropdown and when select dropdown get displayed without null value then other dropdown should appear
- graph - 如何在tikz图片上的圆圈上方画一个数字?
- python-3.x - 我不断收到一个维度错误,它说它期望输入有 4 个维度,但形状为 (2062,64,64)。
- javascript - JS 导入更新的 JSON 文件以用于 ChartJS
- java - 不能在谷歌地图的地方添加标题?
- javascript - 将 AJAX 中的 post 变量发送到 PHP 文件以获取变量
- c++ - 如何在 QLineEdit 的密码模式下使项目符号点更大?
- php - php函数返回某些页面的值,但无法返回具有相同文档结构的其他页面的值
- java - 使用 HikariCP 数据源的 Spring Boot JPA 应用程序中的 Hibernate 会话管理
- java - 无法在 intellij 中运行 java 11 示例程序