原标题:iOS播放器横竖屏切换的实现

所有的视频类App都会面临一个播放器横竖屏切换的问题,之前一直使用KVO强制修改设备方向达到竖屏转为横屏。

UIDevice.current.setValue(value, forKey: "orientation")

目前看来,优酷视频貌似依然使用的这个方法,具体表现为statusBar会跟着屏幕做旋转动画,而且播放器下的其他控件会转到横屏布局。

但是这个方法是非官方提供的API,随着系统版本的更迭有可能会失效。

所以许多公司采用了modal出一个只支持横屏的控制器来达到横竖屏切换的目的。

思路

有以下两种方法实现。

方法1

竖屏转横屏时:由竖屏控制器做一个播放器由小变大,并且旋转为横屏的动画,动画结束时做一个无动画的present

横屏转竖屏时:做一个无动画的dimiss,dimiss完成后,依然由竖屏控制器做播放器由大变小并且旋转回原处的动画。

目前看来,爱奇艺和bilibili貌似使用这个方式,具体表现为竖屏切横屏时,播放器动画完成后,statusBar无动画转为横屏;横屏切竖屏时,statusBar先无动画转为竖屏,然后才开始播放器动画。

这种方法的坑

问题

但是目前这个方法有一个问题,就是在横屏转竖屏时,画面偶尔会闪一下。

问题分析

画面偶尔会闪一下,是在默认的模式下,控制器的.modalPresentationStyle = UIModalPresentationStyle.fullScreen,此时,当控制器A present 出控制器B,完成present动作后,控制器B的view会添加进一个UITransitionView类型的View中(即我们在自定义转场动画时的transitionContext.containerView),UITransitionView是直接添加在Window上的,而控制器A的view会暂时从视图层级中移除。当无动画dimiss时,UITransitionView先从Window移除,然后控制器A的View在添加到window上,在这中间有可能会造成闪动。

所以只要保证完成present动作后,控制器A的view依然保持在视图层级中即可。

解决方案

解决方案1

在UIModalPresentationStyle中有一个枚举类型:.overFullScreen,这个方式的作用就是保证完成present动作后,控制器A的view依然保持在视图层级中。

所以我们设置控制器B的.modalPresentationStyle = .overFullScreen,测试证明这个属性可以保证完成present动作后,控制器A的view依然保持在视图层级中,但是重力感应的方向不会发生改变。所以这个方案不可用。

解决方案2

既然系统没有可以使用的,那我们可以在presen完成后,自己手动把控制器A 的View插入到控制器BView的下边。有两种方式,

方式一:

将控制器A的view直接插入到UITransitionView内的控制器B的View下

// 方式一:将当前控制器的view插入到 横屏view的下方

controller.view.superview?.insertSubview(strongSelf.view, belowSubview: controller.view)

方式二:

将window的rootViewController的View插入到Window之上,UITransitionView之下,这种方式的效果和.overFullScreen的效果一样。

这两种方式都可以,可以根据实际情况来选择使用

// 方式二:.overFullScreen的实际效果

if let keyWindow = UIApplication.shared.keyWindow,let rootViewController = UIApplication.shared.keyWindow?.rootViewController, let containerView = controller.view.superview {

keyWindow.insertSubview(rootViewController.view, belowSubview: containerView)

}

方法2

自定义转场动画!

目前看来,腾讯视频有可能使用这个方式。

但是这个方式也有一个问题,就是自动转场动画后,从横屏返回竖屏,本该竖屏的控制器不能变回竖屏,这应该是苹果的一个bug,目前我的解决方式是在将要展现的生命周期方法中强行设置为正确的fram

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)

print("Tabbar - WillAppear",view.frame)

// 因为 presented 完成后,控制器的view的frame会错乱,需要每次将要展现的时候强制设置一下

view.frame = UIScreen.main.bounds

}

demo

GitHub地址:iOSPlayerVerticalAndHorizontalScreenDemo

链接:http://www.jianshu.com/p/182f6d1e7b04

iOS开发整理发布,转载请联系作者授权返回搜狐,查看更多

责任编辑:

ios 旋转屏幕试图切换_iOS播放器横竖屏切换的实现相关推荐

  1. android关于VideoView或Vitamio视频播放器横竖屏切换

    之前在网上寻求帮助时,留有QQ,好多人加我问过这个问题,现在为了方便大家,我将android关于VideoView或Vitamio视频播放器横竖屏切换的代码放在这里需要的朋友可以看一下,当然我做的这个 ...

  2. ios 旋转屏幕试图切换_iOS屏幕横竖屏切换

    iOS屏幕横竖屏切换 胡东东博客 • 2020 年 10 月 25 日 搜了网上的教程是真的乱,废话不多说,这里从启动到具体的VC,横竖屏切换完美搞定. 如果你的app只需要支持一个方向,那么不需要看 ...

  3. ios 旋转屏幕试图切换_TCL·XESS 旋转智屏 A200Pro 评测:方向一换,体验大不相同...

    点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事! 对于电视,我们大多数人的概念也许是「横在客厅或者卧室的一块屏幕」.它早已经是每个人家庭装修的一部分,但也因为就一直躺 ...

  4. WebView网页视频统一全屏播放及横竖屏切换

    WebView 支持 Html5 video 进行全屏播放及横竖屏自动切换 1.检查AndroidManifest.xml清单文件,WebView控件所在的Activity配置信息;检查Activit ...

  5. Android视频播放器横竖屏切换时遇到的问题记录

    我用的播放器是KMedia,一个开源的播放器,链接如下 https://github.com/BlackQi/KMedia 我个人觉得还是很好用的,支持定制.现在遇到一个问题就是播放时横屏铺满全屏视频 ...

  6. android实现自动横竖屏切换,android 中实现横竖屏切换【原创】

    我们在使用android手机的时候,发现一些应用有横竖屏切换的功能,一般实现有以下几种方法: 一.设置 1.通过XML设置横竖屏切换 在项目的 AndroidManifest.xml中找到你所指定的a ...

  7. android电视横竖屏切换在哪里,Android横竖屏切换总结

    之前在网上看到博客说Activity横竖屏切换的规律如下: (1)不设置android:configChanges,竖屏切换到横屏调用一次生命周期,横屏切竖屏调用两次生命周期. (2)设置 andro ...

  8. ios 旋转屏幕试图切换_iOS屏幕旋转及其基本适配方法

    屏幕旋转示例.jpeg 前段时间抽空总结了一下iOS视频播放的基本用法,发现这其中还有一个我们无法绕过的问题,那就是播放界面的旋转与适配.的确,视频播放与游戏类型的App经常会遇到这个的问题.由于至今 ...

  9. ios 旋转屏幕试图切换_iOS指定页面屏幕旋转,手动旋转(某app实现功能全过程)...

    背景: app内有一个双页的界面,然后某天运营说如果其中一页能支持横屏的话,对接的媒体就能给一整块屏幕,然后需求就这样下来了(双页:一页支持横屏效果,另一页不支持). 接下来就是查文档时间了,Duan ...

  10. ios 旋转屏幕试图切换_总结iOS App开发中控制屏幕旋转的几种方式

    在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewControlle ...

最新文章

  1. 决策树的C++实现(CART)
  2. [javascript] 看知乎学习js闭包
  3. 【源码解析】HashMap源码跟进(红黑树的实现)
  4. 利用python进行数据分析学习笔记(2)
  5. 前端开发技巧-那些不常见但十分有效的小玩意
  6. BAT文件执行完成后如何删除自身的解决办法
  7. 重定向程序中的系统输入输出
  8. Arcgis自带数据地址
  9. 【剑指Offer】15顺时针打印矩阵
  10. php去掉省市区,PHP简单实现正则匹配省市区的方法
  11. 隐马尔可夫链模型学习总结
  12. 深圳自己做网站 服务器,深圳自己做网站 服务器
  13. linux系统底层,干货|七点,用计算机底层知识教你安装Linux系统!
  14. 读Leveraging Unimodal Self-Supervised Learning for Multimodal AVSR论文
  15. 59. 螺旋矩阵 II(中等 数组)
  16. 大数据下机械智能诊断的机遇与挑战,阅读文献系列(一)
  17. docker安装kafka镜像
  18. 股票自动交易接口简化
  19. 设计 | 最新免费无版权可商用字体下载
  20. 收集一些好玩的注释,HAVE FUN!!!

热门文章

  1. ArcGIS地图制图教程——超详细
  2. 零基础云计算学习路线,到底什么是云计算?
  3. ML-Agents命令及配置大全
  4. 直流电机驱动电路设计
  5. VsCode切换语言
  6. TSO、UFO、GSO、LRO、GRO和RSS介绍(ethtool命令)
  7. 偏差、误差、训练误差、测试误差
  8. 使用SpotBugs/FindBugs进行代码检查
  9. 思科arp欺骗攻击,cdp攻击,DHCP攻击实验命令笔记
  10. 【IoT】产品设计:包装盒LOGO设计工艺