先看效果啦
实现
/// 播放器单例
class QPlayerManager: NSObject {
static let shared : QPlayerManager = {
let shared = QPlayerManager()
return shared
}()
lazy var player = AVPlayer()
lazy var layer : AVPlayerLayer = {
let layer = AVPlayerLayer(player: player)
return layer
}()
func playUrl(url : String){
guard let url = URL(string: url) else {
return
}
let item = AVPlayerItem(url: url)
player.replaceCurrentItem(with: item)
player.play()
}
func stop(){
player.pause()
}
}
其实代码不多,逻辑也不复杂。
Banner用的是FSPagerView
设置代理
func pagerViewDidScroll(_ pagerView: FSPagerView) {
.....
.....
.....
QPlayerManager.shared.layer.isHidden = true
QPlayerManager.shared.stop()
if item.filetype.elementsEqual("2") {
print("播放视频")
QPlayerManager.shared.layer.frame = pagerView.cellForItem(at: pagerView.currentIndex)!.bounds
QPlayerManager.shared.layer.isHidden = false
pagerView.cellForItem(at: pagerView.currentIndex)?.layer.addSublayer(QPlayerManager.shared.layer)
QPlayerManager.shared.playUrl(url: item.file)
}
.....
.....
.....
}
当然,当前ViewController不是TopViewController的时候需要停止播放
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
QPlayerManager.shared.stop()
}
优化建议
可以播放将视频停止前一帧截图,当未加载视频时候的预览图
视频播放的时候可以将Banner停止滚动,播放完再滚动
视频播放是铺满的,播放视频的时候把轮播图下一次滚动的时间设置无限大,通知监听视频播放完后再滚动到下一个,滚动间隔时间也恢复默认的