使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本
前言
很早之前开源了一个简单的视频播放器,由于年久失修,效果惨目忍睹,最近特意花时间对其进行了深度重构。旧版本后期不再维护,新版本使用Swift实现,后续会增加更多功能。不想看文字的请自行下载代码------>>>CLPlayer
旧版本 VS 重构版本
1.新版本使用Swift,旧版本使用Objective-C
2.新版本采用自定义转场实现全屏,旧版本使用旋转屏幕
3.新版本不需要手动销毁播放器
4.新版本修复了老版本遗留bug
5.新版本降低了代码耦合性
6.新版本增加了倍数播放,切换填充模式
7.新版本提供更丰富的API
8.新版本适配了iPhone X
9.新版本移除了状态栏相关配置
效果
功能
- [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启动不会横屏
2.AppDelegate中重写func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {}方法
func application(_: UIApplication, supportedInterfaceOrientationsFor _: UIWindow?) -> UIInterfaceOrientationMask {
return .allButUpsideDown
}
3.在父类中重写屏幕控制相关方法
UITabBarController
// 是否支持自动转屏
override var shouldAutorotate: Bool {
guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.shouldAutorotate ?? false }
return navigationController.topViewController?.shouldAutorotate ?? false
}
// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.supportedInterfaceOrientations ?? .portrait }
return navigationController.topViewController?.supportedInterfaceOrientations ?? .portrait
}
// 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
guard let navigationController = selectedViewController as? UINavigationController else { return selectedViewController?.preferredInterfaceOrientationForPresentation ?? .portrait }
return navigationController.topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}
UINavigationController
// 是否支持自动转屏
override var shouldAutorotate: Bool {
return topViewController?.shouldAutorotate ?? false
}
// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return topViewController?.supportedInterfaceOrientations ?? .portrait
}
// 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return topViewController?.preferredInterfaceOrientationForPresentation ?? .portrait
}
UIViewController
// 是否支持自动转屏
override var shouldAutorotate: Bool {
return true
}
// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
// 默认的屏幕方向(当前ViewController必须是通过模态出来的UIViewController(模态带导航的无效)方式展现出来的,才会调用这个方法)
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return .portrait
}
4.部分页面需要支持多方向
在对应控制器中重写以下方法
override var shouldAutorotate: Bool {
return true
}
// 支持哪些屏幕方向
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .allButUpsideDown
}
基础配置
public struct CLPlayerConfigure {
/// 顶部工具条隐藏风格
public enum CLPlayerTopBarHiddenStyle {
/// 小屏和全屏都不隐藏
case never
/// 小屏和全屏都隐藏
case always
/// 小屏隐藏,全屏不隐藏
case onlySmall
}
/// 自动旋转
public var isAutoRotate = true
/// 手势控制
public var isGestureInteractionEnabled = true
/// 是否显示更多面板
public var isShowMorePanel = true
/// 顶部工具条隐藏风格
public var topBarHiddenStyle: CLPlayerTopBarHiddenStyle = .onlySmall
/// 工具条自动消失时间
public var autoFadeOut: TimeInterval = 5
/// 默认拉伸方式
public var videoGravity: AVLayerVideoGravity = .resizeAspectFill
/// 顶部工具条背景颜色
public var topToobarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
/// 底部工具条背景颜色
public var bottomToolbarBackgroundColor: UIColor = .black.withAlphaComponent(0.6)
/// 进度条背景颜色
public var progressBackgroundColor: UIColor = .white.withAlphaComponent(0.35)
/// 缓冲条缓冲进度颜色
public var progressBufferColor: UIColor = .white.withAlphaComponent(0.5)
/// 进度条播放完成颜色
public var progressFinishedColor: UIColor = .white
/// 转子背景颜色
public var loadingBackgroundColor: UIColor = .white
/// 返回按钮图片
public var backImage: UIImage?
/// 更多按钮图片
public var moreImage: UIImage?
/// 播放按钮图片
public var playImage: UIImage?
/// 暂停按钮图片
public var pauseImage: UIImage?
/// 进度滑块图片
public var sliderImage: UIImage?
/// 最大化按钮图片
public var maxImage: UIImage?
/// 最小化按钮图片
public var minImage: UIImage?
/// 封面图片
public var maskImage: UIImage?
}
总结
本次重构为Swift第一版,后续会持续更新,定制化开发请自行参考CLPlayer修改 , 如果喜欢,欢迎star。
参考资料
使用AVPlayer自定义支持全屏的播放器(五)—Swift重构版本的更多相关文章
- Android中使用WebView实现全屏切换播放网页视频
首先写布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/an ...
- 自定义一个全屏的AlertDialog。
........... final MyDialog dialog = new MyDialog(this); LayoutInflater inflater = getLayoutInflater( ...
- video 全屏,播放,隐藏控件。
requestFullscreen全屏具体实现 1.进入全屏 function full(ele) { if (ele.requestFullscreen) { ele.requestFullscre ...
- IOS写一个能够支持全屏的WebView
这样来写布局 一个TitleView作为顶部搜索栏: @implementation TitleView - (id)initWithFrame:(CGRect)frame { self = [sup ...
- .net C# 网页播放器 支持多种格式 媒体播放器 播放器 代码
.avi格式代码片断如下:<object id='video' width='400' height='200' border='0' classid='clsid:CFCDAA03-8BE4- ...
- 全平台网页播放器兼容H5与Flash还带播放列表
许久不发文了,2018年第一篇文章,写点干货--关于网页播放器的问题.嗯,实际上我是在52破解首发的,当做新人贴. 目前来说,网页播放器不少,随便找找都能找到一大堆,然而好用的就那么几个,比如ckpl ...
- android全功能音乐播放器、基于MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + MTRVA的综合应用、图片滤镜处理等源码
Android仿微信朋友圈查看图片下拽返回. Android图片滤镜处理,相机滤镜处理效果源码 Android自定义View源码:一个水平的进度条 基于MVP-Clean + Weex + RxJav ...
- 支持多种格式的播放器js代码
FLV需要播放器,其它视频格式直接插入相应的代码即可. ------------------------------------- /** *视频播放 by zhensheng@ *参数说明 ...
- Android 使WebView支持HTML5 Video(全屏)播放的方法
http://blog.csdn.net/zrzlj/article/details/8050633 1)需要在AndroidManifest.xml文件中声明需要使用HardwareAcceler ...
随机推荐
- springcloud报Load balancer does not have available server for client: PROVIDER-SERVER
1.后台报错截图 这个的意思就是:负载均衡服务器中没有这个我自定义的PROVIDER-SERVER.开始我以为是Ribbon的原因,所以去折腾了一下,但是:最后不断往前推到之后发现本质是:在注册中心E ...
- react动态添加样式:style和className
react开发过程中,经常会需要动态向元素内添加样式style或className,那么应该如何动态添加呢??? 一.react向元素内,动态添加style 例如:有一个DIV元素, 需要动态添加一个 ...
- Git配置文件与git config命令
在Git配置文件中配置变量,可以控制Git的外观和操作的各个方面.通过git config命令可以获得和设置配置变量. 一.Git配置文件的位置 这些变量可以被存储在三个不同的位置: 1./etc/g ...
- spring定时任务执行两次
最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...
- HongYun项目启动
一个前后端分离项目的启动顺序: 数据库启动, stams 后台springboot启动 中间路由启动,比如nginx,如果有的话:有这一层,后台可以设置负载均衡,可以动态部署 前端启动
- OC-封装,继承,多态
主要内容概括 标号 主题 内容 一 封装 面向对象三大特性;封装的概念/原因/好处/原则 二 *getter和setter setter / getter方法;注意点 三 自定义代码段 如何自定义代码 ...
- 【Linux】【Services】【Cache】使用Sentinel搭建高可用Redis
1. 简介 1.1. 一些基础概念请参考 http://www.cnblogs.com/demonzk/p/7453494.html 1.2. 几种常用的集群方式. -- Redis Sentinel ...
- Linux单机安装Zookeeper
一.官网 https://zookeeper.apache.org/ 二.简介 Apache ZooKeeper致力于开发和维护开源服务器,实现高度可靠的分布式协调. ZooKeeper是一种集中式服 ...
- Linux core 文件浅析
浅析Linux下core文件 当我们的程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员找到程序出现问题的地方.最常出 现的,几乎所有C程序员都出现过的错误就是"段错误& ...
- NEEPU-CTF 2021公开赛 writeup
没打这场比赛,但是题目质量挺高的.赛后赶紧学习一波. RUSH B Linux入门 考linux指令的. cat hint.txt 提示让访问根目录. ls / 发现flag cat flag 提示说 ...