前言
学习swift/81184.html">swift有段时间了,原来写过一个基于 swift 3.0 的视频播放,后来有同学联系我说,在音频锁屏的情况下,无法用控制面板拖动进度条调节播放进度,所以又将原来的代码拿过来重新整理了下也顺便更新到了4.0版本。在把原来的代码拿来的时候发现原来有好多地方都是错误的,原来在 OC 项目里面已经写过一遍关于视频播放的东西所以就按照原来的逻辑写了 swift 版本,其实里面很多代码我也是通过查找资料和看文档拼凑出来的,对于 swift 的语句也是一知半解,希望各位看官多多包涵。
先来看一下实现的效果,一图胜千言(第一张是 iOS 10系统,第二张是 iOS 11系统)。


demo下载地址
工程介绍
简单说一下工程结构,所有关于布局都是在Player文件夹下的MPlayerViewModel文件中,考虑到耦合度的原因,所以将视频播放的所有 UI 布局全部抽离出来,在播放器 view 里将会频繁看到一个叫viewModel的对象,它既 UI 布局也是布局控件的所有者。视频播放的布局是基于SnapKit三方库来布局了,因为在OC里用惯了Masonry所以工程里依然沿用这个库。主要代码是放到MPlayerView这个文件中的,其中还有一个由 OC 写的DeviceTool文件主要用来做页面强制旋转用的,强制旋转这一部分我现在还没有更好的解决办法只能桥接 OC 里的方法。
初始化播放器方法
视频播放界面我用的是一个单例实现的,刚开始不是用单例实现,但是为了把代码拆出来放到各自的功能区所以用单例实现是最好的方法。由于swift放弃了OC里的dispatch_once实现单例方法,swift3.0以后的单例写法:
/// 创建播放器单例
static let shared = MPlayerView()
private override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
在swift3.0之后重写init方法必须实现required init方法,这么做也是为了安全,因为在OC里init方法并不能保证子类完成初始化,增加required“这是由初始化方法的完备性需求所决定的,以保证类型的安全。在创建视频播放视图有两种创建方式:1.用单利创建。2.init 初始化 ,这两种方法都可以达到视频播放的效果。








