经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本
来源:cnblogs  作者:JmoVxia  时间:2021/12/31 8:56:00  对本文有异议

前言

很早之前开源了一个简单的视频播放器,由于年久失修,效果惨目忍睹,最近特意花时间对其进行了深度重构。旧版本后期不再维护,新版本使用Swift实现,后续会增加更多功能。不想看文字的请自行下载代码------>>>CLPlayer

旧版本 VS 重构版本

1.新版本使用Swift,旧版本使用Objective-C

2.新版本采用自定义转场实现全屏,旧版本使用旋转屏幕

3.新版本不需要手动销毁播放器

4.新版本修复了老版本遗留bug

5.新版本降低了代码耦合性

6.新版本增加了倍数播放,切换填充模式

7.新版本提供更丰富的API

8.新版本适配了iPhone X

9.新版本移除了状态栏相关配置

效果

效果图

全屏

控制面板

3.png

4.png

功能

  • [x] 支持全屏模式、小屏模式
  • [x] 支持跟随手机自动旋转
  • [x] 支持本地视频、网络URL
  • [x] 支持UITableView
  • [x] 支持UICollectionView
  • [x] 支持手势改变屏幕的亮度(屏幕左半边)
  • [x] 支持手势改变音量大小(屏幕右半边)
  • [x] 支持拖动UISlider快进快退
  • [x] 支持iPhone X留海屏
  • [x] 支持倍速播放(0.5X、1.0X、1.25X、1.5X、1.75X、2X
  • [x] 支持动态改变播放器的填充模式(适应、拉伸、填充
  • [x] 支持cocoapods

接入指南

项目必须支持全屏,建议将屏幕支持方向交由当前显示的控制器自行管理。

项目支持全屏方案

1.先勾选支持方向,只保留portrait,保证APP启动不会横屏

5.png

2.AppDelegate中重写func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {}方法

  1. func application(_: UIApplication, supportedInterfaceOrientationsFor _: UIWindow?) -> UIInterfaceOrientationMask {
  2. return .allButUpsideDown
  3. }

3.在父类中重写屏幕控制相关方法

UITabBarController

  1. // 是否支持自动转屏
  2. override var shouldAutorotate: Bool {
  3. guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.shouldAutorotate ?? false }
  4. return navigationController.topViewController?.shouldAutorotate ?? false
  5. }
  6. // 支持哪些屏幕方向
  7. override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  8. guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.supportedInterfaceOrientations ?? .portrait }
  9. return navigationController.topViewController?.supportedInterfaceOrientations ?? .portrait
  10. }
  11. // 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
  12. override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
  13. guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait }
  14. return navigationController.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
  15. }

UINavigationController

  1. // 是否支持自动转屏
  2. override var shouldAutorotate: Bool {
  3. return topViewController?.shouldAutorotate ?? false
  4. }
  5. // 支持哪些屏幕方向
  6. override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  7. return topViewController?.supportedInterfaceOrientations ?? .portrait
  8. }
  9. // 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
  10. override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
  11. return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
  12. }

UIViewController

  1. // 是否支持自动转屏
  2. override var shouldAutorotate: Bool {
  3. return true
  4. }
  5. // 支持哪些屏幕方向
  6. override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  7. return .portrait
  8. }
  9. // 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
  10. override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
  11. return .portrait
  12. }

4.部分页面需要支持多方向

在对应控制器中重写以下方法

  1. override var shouldAutorotate: Bool {
  2. return true
  3. }
  4. // 支持哪些屏幕方向
  5. override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  6. return .allButUpsideDown
  7. }

基础配置

  1. public struct CLPlayerConfigure {
  2. /// 顶部工具条隐藏风格
  3. public enum CLPlayerTopBarHiddenStyle {
  4. /// 小屏和全屏都不隐藏
  5. case never
  6. /// 小屏和全屏都隐藏
  7. case always
  8. /// 小屏隐藏,全屏不隐藏
  9. case onlySmall
  10. }
  11. /// 自动旋转
  12. public var isAutoRotate = true
  13. /// 手势控制
  14. public var isGestureInteractionEnabled = true
  15. /// 是否显示更多面板
  16. public var isShowMorePanel = true
  17. /// 顶部工具条隐藏风格
  18. public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall
  19. /// 工具条自动消失时间
  20. public var autoFadeOut: TimeInterval = 5
  21. /// 默认拉伸方式
  22. public var videoGravity: AVLayerVideoGravity = .resizeAspectFill
  23. /// 顶部工具条背景颜色
  24. public var topToobarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
  25. /// 底部工具条背景颜色
  26. public var bottomToolbarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
  27. /// 进度条背景颜色
  28. public var progressBackgroundColor: UIColor = .white.withAlphaComponent(0.35)
  29. /// 缓冲条缓冲进度颜色
  30. public var progressBufferColor: UIColor = .white.withAlphaComponent(0.5)
  31. /// 进度条播放完成颜色
  32. public var progressFinishedColor: UIColor = .white
  33. /// 转子背景颜色
  34. public var loadingBackgroundColor: UIColor = .white
  35. /// 返回按钮图片
  36. public var backImage: UIImage?
  37. /// 更多按钮图片
  38. public var moreImage: UIImage?
  39. /// 播放按钮图片
  40. public var playImage: UIImage?
  41. /// 暂停按钮图片
  42. public var pauseImage: UIImage?
  43. /// 进度滑块图片
  44. public var sliderImage: UIImage?
  45. /// 最大化按钮图片
  46. public var maxImage: UIImage?
  47. /// 最小化按钮图片
  48. public var minImage: UIImage?
  49. /// 封面图片
  50. public var maskImage: UIImage?
  51. }

总结

本次重构为Swift第一版,后续会持续更新,定制化开发请自行参考CLPlayer修改 , 如果喜欢,欢迎star。

参考资料

  1. iOS播放器全屏方案

  2. iOS状态栏

  3. iOS播放器全屏旋转实现

  4. iOS横竖屏旋转解决方案 - Swift

  5. iOS视频旋转探究

  6. iOS屏幕旋转的解决方案

作者:JmoVxia
本文版权归作者所有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

原文链接:http://www.cnblogs.com/JmoVxia/p/15743844.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号