美文网首页
日常:视频全屏屏幕旋转

日常:视频全屏屏幕旋转

作者: 欧特耳佩 | 来源:发表于2018-06-28 13:17 被阅读0次

一般在项目当中我们会设置app仅支持Portrait(home btn on the botton),并且保证适配所有尺寸的屏幕。如果进行了屏幕旋转(左右),那多数是会UI错乱的。

当一个视频播放需要全屏时,我们可以通过其他app发现其实它做了屏幕旋转的。

一、为什么说还是做了屏幕旋转

  1. 视频内容显示时:(以AVPlayer为例)

    • 原比例显示,导致其余留黑
    • 原比例拉伸,导致内容裁剪
    • 拉伸到边框,导致内容拉伸
  2. 如果没有做屏幕旋转,首先播放按钮位置不会有改变,其次全屏显示会导致上下两部分留黑(参见WWDC内视频)

二、怎么做屏幕旋转

  1. 点击全屏,屏幕旋转横屏(欺骗系统,设置设备方向)
let unknown = UIInterfaceOrientation.unknown.rawValue as NSNumber
UIDevice.current.setValue(unknown, forKey: "orientation")
let left = UIInterfaceOrientation.landscapeRight.rawValue as NSNumber
UIDevice.current.setValue(left, forKey: "orientation")
  1. 重写viewDidLayoutSubviews()

    • 当设置设备方向时会走此方法

    • 判断当前设备方向,跳过无需布局
      let duration = UIDevice.current.orientation

    • 旋转横屏后StatusBar是否隐藏(ios9.0横屏默认隐藏)

      • 设置StatusBarBool
      • 调用setNeedsStatusBarAppearanceUpdate()
    • 编写横屏布局

      • 旋转180:self.view.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
      • 改变播放视图frame:
        CGRect(x: 0, y:0, width:屏幕的高 , height: 屏幕的宽)
      • 隐藏其他控件
    • 编写竖屏布局

      • 旋转回来:self.view.transform = CGAffineTransform(rotationAngle: CGFloat(0))
      • 还原播放视图frame
      • 还原其他控件
  2. 全屏返回时的操作

  • 获得当前设备方向,按需操作(portrait left right
    • portrait时
      • 返回上级页面pop or dismiss
    • 全屏时
      • 重设设备方向
let unknown = UIInterfaceOrientation.unknown.rawValue as NSNumber
UIDevice.current.setValue(unknown, forKey: "orientation")
let por = UIInterfaceOrientation.portrait.rawValue as NSNumber
UIDevice.current.setValue(por, forKey: "orientation")

注意:

相关文章

网友评论

      本文标题:日常:视频全屏屏幕旋转

      本文链接:https://www.haomeiwen.com/subject/mvsheftx.html