一、场景

通过混合开发方式,前端调用native端的接口,进入视频播放后返回,然后界面显示混乱,看起来感觉是没有恢复成竖屏状态(视频播放界面是横屏的,其他界面是竖屏)。

二、问题分析

1、查看横竖屏实现逻辑

#import "UIDevice+TFDevice.h"

@implementation UIDevice (TFDevice)

+ (void)switchNewOrientation:(UIInterfaceOrientation)interfaceOrientation

{

NSNumber *resetOrientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];

[[UIDevice currentDevice] setValue:resetOrientationTarget forKey:@"orientation"];

NSNumber *orientationTarget = [NSNumber numberWithInt:interfaceOrientation];

[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];

}

@end

主要是在view 的生命周期viewDidLoad viewWillDisappear  中分别调用设置 UIInterfaceOrientationLandscapeRight  UIDeviceOrientationPortrait 来实现的,从监听事件的逻辑来看:

设备是正常实现了横竖屏切换的,但是返回到前端界面后,就是有问题,刚开始我还怀疑是不是前端界面渲染问题,后面发现另外一个功能也是前端调用native 接口,然后进入的功能界面也是横屏,同样native实现,但是返回后正常显示,于是判断应该还是native 在视频播放这块的实现问题,后面就开始进行逻辑对比。

一对比才发现两个view 的进入呈现方式是有差异的,视频这个是通过模态视图打开的,用的是 presentViewController , 而那个正常功能的进入方式是通过pushViewController打开,带有导航栏的。从这个差异点,我慢慢开始调试,发现换成push 这种方式就确实正常了,具体原因也不清楚,就先换过来再说。

但是接着发现原先使用模态方式打开的view界面是xib中实现的,其自己增加了一个title 栏,但是这个高度是和导航栏的高度不同的,于是打开xib界面,打算将其去除,这样导航栏是正常显示了,但是问题接着来了,视频播放界面的范围始终没法和导航栏严丝合缝地对接:

play view 是外层view 的一个子视图,后来打算在代码中通过直接设置frame 来达到和导航栏的显示对接,但是始终无效:

#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

#define NAVIGATIONBARHEIGHT (self.navigationController.navigationBar.frame.size.height)

// 横屏时导航栏高度固定32,竖屏时44

#define NAVIGATION_HEIGHT_LANDSCAPE 32.f

self.playView.frame = CGRectMake(0, NAVIGATION_HEIGHT_LANDSCAPE, SCREEN_WIDTH, SCREEN_HEIGHT);

通过日志输出发现, 代码中获取到的屏幕宽和高,与xib 中的有差异,xib 中是以选择的view as 设备的屏幕尺寸来显示的, 不是以实际运行的手机设备尺寸。所以总是对不上,左右看了xib里面的各种参数设置,不甚了解,最终想了一个方法,就是只修改距离顶部的高度,而不去改变其width 和 height

CGSize playviewSize = self.playView.frame.size;

self.playView.frame = CGRectMake(0, NAVIGATION_HEIGHT_LANDSCAPE, playviewSize.width, playviewSize.height-NAVIGATION_HEIGHT_LANDSCAPE);

就这样算是将问题解决了。

后来又在自测的过程中发现,当程序挂起到后台的时候,然后再恢复,视频播放就消失了,

回头又仔细看了一下源码,发现挂起是停止了播放,恢复时居然没有恢复播放,这个是好久的适配代码了,当时不知道怎么拼凑出来的,于是又在对应的生命周期进行 停止播放 和 恢复播放的对称处理。

applicationWillResignActive

applicationDidBecomeActive

以上这些问题应该是两年前留下的,知道今天又需要重新阅读修复,也是当初做完之后无人使用,现在用起来就需要还账了。

ios 横竖屏显示视频播放问题分析相关推荐

  1. iOS 横竖屏切换解决方案

    iOS 横竖屏切换解决方案 参考文章: (1)iOS 横竖屏切换解决方案 (2)https://www.cnblogs.com/qqcc1388/p/7358552.html 备忘一下.

  2. 全志H6 Android 7.0 平台 修改横竖屏显示

    **问题描述:**全志H6 Android 7.0 并没有给出横竖屏显示属性的设置,可以自己设置一个persist.sys.rotation属性来控制横竖屏的显示 解决方案: diff --git a ...

  3. iOS 横竖屏处理方案

    概要:这里只说项目如何配置横竖屏,具体横竖屏适配可以参考下文图解---横屏的VC--最后一个方法里适配横竖屏,用 AutoLayout 的话就不用处理了,注意横屏后刘海屏的左右边距,我习惯一般直接给个 ...

  4. 如何解决ios横竖屏切换布局错乱的问题

    如何解决ios横竖屏切换布局错乱的问题 可以使用 location.reload(); 强制刷新页面 mounted () {// 监听 resize 方法window.addEventListene ...

  5. flutter3 强制横屏,控制横竖屏显示

    进入app,就设置整个app为竖屏显示 void main() {WidgetsFlutterBinding.ensureInitialized(); //不加这个强制横/竖屏会报错SystemChr ...

  6. 横竖屏显示 图片分辨率

    1.         设置屏幕的横竖屏显示: 如果不做特殊说明,开发的应用是横竖屏重力敏感的,如果禁止横竖屏切换,需要在AndroidManifest.xml文件中做相应的修改: <activi ...

  7. iOS横竖屏旋转及其基本适配方法

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

  8. ios 横竖屏转换通知问题

    关于ios 屏幕横竖屏切换问题 当设备方向改变时,系统会发送通知 UIDeviceOrientationDidChangeNotification,但这里有一个问题,当手动转换设备方向时,在瞬间又转换 ...

  9. IOS横竖屏控制与事件处理

    公司App里面有个需求,即所有界面都是竖屏,且不允许横屏切换,唯独有一个图表界面允许横屏.那么,根据此需求处理如下: 首先,确保App本身应该允许转屏切换: 再次,我的App里面都是走UINaviga ...

  10. uniapp使用横竖屏显示样式错乱问题。

    记得在需要切换横竖屏的页面写 在onload生命周期写 onLoad() {// #ifdef APP-PLUSuni.showLoading({title:"加载中..."})s ...

最新文章

  1. Mybatis复习笔记3:映射文件详解
  2. 输出超限怎么解决 oj_三菱PLC输出指示灯输出模块不亮怎么解决
  3. python 报错 Missing dependencies for SOCKS support 解决方法
  4. python 批量改名
  5. python教程书籍-有什么Python学习的书籍和学习资源推荐?
  6. java求婚代码_屌丝程序员的求婚道具--内含视频
  7. vueRouter-命名视图
  8. 加密 解密常用的算法
  9. 企业信息管理- 近期功能改善(3)
  10. 建立数组并写入数据_VBA数组与字典解决方案第37讲:在VBA中字典的应用
  11. 1 数列分块入门_怎样用通俗易懂的语言让小学 OIer 理解并能初步运用线段树?...
  12. mysql 1005 150_錯誤1005 errno:150與mysql
  13. view 判断显示 微信_微信小程序开发用户授权登录(上)
  14. mysql charactersetdatabase_Mysql5.7.22 坑爹的 `character_set_database`
  15. QCC3003x BLE 设置私有地址
  16. SpringBoot整合JdbcTemplate(五)
  17. Python 算法交易实验41 GMM简单估计
  18. CITA 技术白皮书
  19. hdu 1207 汉诺塔II (四柱汉诺塔)
  20. 开放式办公室不利心理健康:噪音大且效率低

热门文章

  1. 动态分级存储特性-SmartTier
  2. echarts画工作流(流程图)
  3. 2^n-1的因数分解问题
  4. 计算机无法安装win10,电脑无法安装win10系统的原因及解决方法
  5. RS-485总线,这篇很详细
  6. 怎样把PDF文件压缩变小?
  7. python用户画像_python用户画像
  8. Power bi 3.10 折线和堆积柱形图
  9. 应用系统云原生架构衡量指标
  10. 量化投资中收益率的计算方法