再谈iOS视频播放器旋转视图开发
http://ddrccw.github.io/2015/06/24/tips-on-changing-orientation-2
前言
经过了云课堂,公开课,中国大学mooc三种旋转需求的考(zhe)验(mo),也踩过了好多坑。虽然之前有写过一篇文章已经小结过一些问题,但现在再读,感觉还探讨地不够,故又补上一篇,希望能就此彻底做个了结。当然,也希望读过此文的童鞋能少走些弯路。。
注:此文提到的旋转包括页面和状态栏
正题
3种需求
3个app的旋转需求实现难度可以说是从易到难。
云课堂
云课堂的需求和实现最简单。相信大部分的app都是这个需求。
需求:进入播放页面默认横屏,同时支持页面自动旋转。
实现:因为是基于设备的系统事件通知来让页面响应旋转,所以关键是只要设置好- (BOOL)shouldAutorotate
、- (NSUInteger)supportedInterfaceOrientations
、- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
等几个函数即可。
公开课
公开课的需求和实现较云课堂来说要求要高一些。
需求:旋转的控制交给用户选择,而不是受系统控制。
实现:属于要无视设备的系统事件通知强制让页面旋转,具体可以参看前文
中国大学mooc
中国大学mooc的要求最高,是上述两种情况的结合体
需求:
进入播放页面默认横屏,同时支持页面自动旋转;
页面旋转不受系统自带的竖排锁定按钮控制,但是用户可以锁定旋转方向。
实现:
本质上来讲,它的实现是公开课方案的加强版。同样要无视设备的系统事件,而且是基于自定义的设备事件通知页面强制旋转。
强制旋转方式同公开课,但是实际开发过程中未遇到前文提到的需要强制把transform和frame的动画拆到两个animate block的问题,囧rz。。。关于自定义设备旋转通知,利用core motion来检测计算,具体代码是基于网上找的某段代码改的(抱歉忘了原作者是谁。。),代码查看请猛击这里。
一个坑引发的系列惨案
前面概述了我经历过的一些开发需求,下面重点讲一下我在开发过程中遇到的一个坑。
坑
相信开发过强制旋转的童鞋,应该都遇到过这么一个令人抓狂的问题:
原本在iOS8之前都是运行正常的代码,在iOS 8上运行强制旋转过后,屏幕的部分区域不能响应你的touch(没错,就是有些区域的按钮不能点了。。)。情况如图(别人画的):
在stackoverflow上一搜,也可以搜出一堆,比如这个,这个,还有这个。
一度也怀疑是否是自己的代码哪里写的不对。直到官方贴出iOS 8.3的这个升级说明,基本可以确信这个是iOS 8.3以前的系统bug(iOS 8 bug好多?!也难怪iOS 9要专注于系统稳定性和优化)
那么,直接用iOS 8以前的代码,在iOS8.3之后的系统上是不是直接运行也就没有问题了呢?答案是否定的。因为iOS 8以前,window的frame和StatusBarOrientation无关,始终都是Portrait的,但是iOS 8以后window的frame和StatusBarOrientation有关,会随着StatusBarOrientation的变化而变化。如果你用到了window的frame,那么必然还是会有影响的。
这里我做了一个demo,大家可以在iOS(-∞,8), [8, 8.3), [8.3, +∞)这三种情况的系统上运行一下,体会一下这个坑。。。
思路
既然知道坑的存在,那么又该如何解决呢?
A模式(window-viewController-view)
一般来说,待旋转的页面往往在window(无论是默认的window,还是你自己创建的window)下某个viewController内,而上述的bug也是发生在这种情况下。
B模式(window-view)
偶然的一次搜索让我看到这个帖子,有人提到直接把待旋转的页面
addSubview
到window中(注:不要设置rootViewController),可以避免出现上述的bug。我在demo中试了一下确实如此,然而遗憾的是,该方案反而会在[8.3, +∞)的系统上出现点击区域不全的问题。。。
总之,我表示目前我还找不到一个简单的通用方法。。以下是我觉得设计代码时,可以考虑的思路
也就是说,保证强制旋转可行性的问题,是在保证全部区域可点的前提下,同时考虑是否要需要旋转状态栏的问题。要根据实际需求,针对不同的系统版本写兼容性代码。
连锁反应
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
的影响。A模式下旋转页面和状态栏。如果是整个viewController被present,那么它在dimiss前,要保证状态栏的方向和- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
一致,否则在[8, 8.3)会发现dismiss后presentingViewController的方向会受影响。可以在demo试试哦+_+- alert view的展示和状态栏的方向有关。如果你仅需要旋转页面而不转状态栏只是隐藏,那么在A模式下旋转了页面后,alert view的展示会是个问题。
- 如果alert view是定制的,那么请同时考虑1,2问题所带来的影响。对于前者,取决于你的alert view是否需要支持
preferredInterfaceOrientationForPresentation
;对于后者,你要让你的alert view判断好它所处的当前viewController的真实展示方向,不能简单通过状态栏判断哦。
总结
要想获得旋转问题(尤其是强制旋转)的完美解决,目前我觉得需要一定的开发成本,所以应该需要根据需求做出一点取舍吧^_^
参考资料
1) http://stackoverflow.com/questions/28684976/ios8-how-to-show-a-different-view-controller-when-the-phone-rotates-to-landscap?lq=1
2) http://forum.unity3d.com/threads/problem-with-changing-screen-orientation.274056/
再谈iOS视频播放器旋转视图开发相关推荐
- iOS 视频播放器开发
需求设计 做一个小学生教育辅导视频播放器. 参考小猿搜题视频播放器 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0GsyFSt-1675164972791)(htt ...
- iOS视频播放器,IJKMediaFramework开发环境和测试环境集合包
iOS视频播放器,IJKMediaFramework开发环境和测试环境集合包,支持https视频流播放,解压后大概160M多一点点.欢迎下载, 链接: https://pan.baidu.com/s/ ...
- html ios视频播放器,良心推荐!iOS端的视频播放应用
不知道大家还记不记得之前小编我推荐的最好用的iOS音乐播放器,如果没看过,可以点击这里.既然之前介绍了一款iOS端的音乐播放器给大家,那么今天就介绍一款iOS端十分好用的万能解码的视频播放器. 使用i ...
- 浅谈iOS视频播放的N种解决方案
header.jpeg 前言 虽然我不同意你的观点 但我誓死捍卫你说话的权利!--伏尔泰 很长时间没有写文章了,这个题目其实我很早就想动笔写了,因为从我第一个完整的APP项目开始,几乎每一个APP都有 ...
- IOS视频播放器的制作
利用自带MPMoviePlayerController来实现视频播放,首先要在项目中导入MediaPlayer.Framework框架包. 在视图控制器中 #import "MediaPla ...
- Android多媒体之视频播放器高级开发
1.获取播放的数据源 播放视频的数据源一般有两个,一个是请求网络,从服务器后台直接获取播放的视频信息,另一种是播放手机中本地的视频,这里我们采用的播放源为播放手机本地的视频 1.1 查询获取手机中的视 ...
- C++黑客编程:视频播放器的开发
有一年多没写了,挺对不起大家. 我是用MFC写的,2021年用MFC是不是有一点可笑 废话不多说,上项目展示图: 我用VLC的库做的,大家可以在官网下载,我有一个百度网盘链接: **链接:https: ...
- Android进阶:自定义视频播放器开发(下)
上一篇文章我们主要讲了视频播放器开发之前需要准备的一个知识,TextureView,用于对图像流的处理.这篇文章开始构建一个基础的视频播放器. 一.准备工作 在之前的文章已经说过了,播放器也是一个vi ...
- 【QT/C++】基于QT开发的一款A-SOUL元素的视频播放器(附源码)
[QT/C++]基于QT开发的一款关于A-SOUL的视频播放器(附源码) 前言 一.软件使用说明 1.运行软件的界面如下 2.操作软件的步骤 二.软件设计说明 1.UI界面的设计 2.主代码中的部分函 ...
- 利用DirectShow开发C#版的视频播放器
今天这里要给各位朋友介绍的是本人利用业余时间使用C#编写的一个视频播放器,开发环境为Microsoft Visual Studio 2008/C#.Microsoft DirectX 9.0 SDK. ...
最新文章
- 解决数据库里表字段带下划线,实体类转小驼峰,Mapper的映射问题
- winRAR 没有右键选项
- web开发中常见的安全漏洞及避免方法
- boost::graph::distributed用法的测试程序
- springcloud——eureka小错误Caused by: java.net.UnknownHostException: eureka7003.com
- oracle开窗函数是什么,ORACLE数据库(六)-----开窗函数
- ros(6) service server编程实现
- 如何制作自己的R包?
- c语言min函数_C语言探索之旅 | 第一部分第十课:第一个C语言小游戏
- 微信公众平台开发(75) 语音识别
- docker使用_Docker的基本使用
- iOS 创建单例的方法
- vmware虚拟机添加物理网卡与虚拟网卡
- 二元二次方程例题_二元二次方程组 解法 例题精编版
- PostgreSQL 获取所有库名、表名、字段名
- python 网页爬虫,带登陆信息
- iPhone 13关闭个性化广告该怎么关 关闭个性化广告教程一览
- HTML中的标记-遁地龙卷风
- 信息安全概论(第3版)课后习题答案 牛少彰 崔宝江 李剑编著
- sumatrapdf关闭当前tab快捷键