ZFPLayer 是一款强大开源的视频播放器,在结合列表播放滑动超出当前视频范围调用 addPlayerViewToSmallFloatView开启小窗播放(类似画中画,但没有其强大和友好的交互)布局错误并且右上角的关闭按钮也没法关闭,错乱参考图如下:
1、样式错乱原因分析:
self.currentPlayerManager.view.autoresizingMask 以父视图为基础进行动态响应,而在 addPlayerViewToSmallFloatView 和 addPlayerViewToContainerView 等方法中将当前视频播放对象(self.currentPlayerManager.view)分别添加到 self.smallFloatView、self.containerView 等视图中没有移除之前的添加
解决方法:
添加(即调用:addSubview:self.currentPlayerManager.view)之前先移除 [self.currentPlayerManager.view removeFromSuperview]
2、小窗播放右上角关闭无效
解决方法:实现 ZFPlayerControlView 对象的 floatControlView.closeClickCallback 回调方法,在方法里面调用 self.playManager.stop() 即可关闭
private lazy var controlView:ZFPlayerControlView = {
let _cv = ZFPlayerControlView.init()
//全屏模式
_cv.fullScreenMode = .landscape
_cv.landScapeControlView.fullScreenMode = .landscape
//显示控制层
_cv.prepareShowControlView = true
//不隐藏控制视图
_cv.portraitControlView.isHidden = false
//显示加载视图
_cv.prepareShowLoading = true
//退出全屏被点击(全屏返回按钮被点击)
_cv.backBtnClickCallback = {[weak self] in
guard let self = self else { return }
self.data?.isAutorotate = false
self.data?.faceOrientation = .portrait
self.player.rotate(to: .portrait, animated: false) {
print("已返回小屏")
}
//退出全屏
self.player.enterFullScreen(false, animated: false)
//恢复原始状态
if self.player.isSmallFloatViewShow || self.isSmallView {
self.player.addPlayerViewToSmallFloatView()
}
else{
self.player.addPlayerView(toContainerView: self.contentView)
}
}
/// 小窗播放关闭事件
_cv.floatControlView.closeClickCallback = {[weak self] in
guard let self = self else { return }
self.player.stopCurrentPlayingView()
self.playManager.stop()
}
return _cv
}()
处理后最终效果如下图: