MoviaBox/ShortPlay/Class/Player/View/SPPlayerListCell.swift

195 lines
4.7 KiB
Swift

//
// SPPlayerListCell.swift
// ShortPlay
//
// Created by on 2025/4/9.
//
import UIKit
class SPPlayerListCell: SPCollectionViewCell, SPPlayerProtocol {
var PlayerControlViewClass: SPPlayerControlView.Type {
return SPPlayerControlView.self
}
weak var viewModel: SPPlayerListViewModel? {
didSet {
controlView.viewModel = viewModel
}
}
var isLoop = true {
didSet {
player.isLoop = isLoop
}
}
private lazy var player: SPPlayer = {
let player = SPPlayer()
player.playerView = playerView
player.delegate = self
return player
}()
private lazy var playerView: UIView = {
let view = UIView()
return view
}()
private lazy var coverImageView: SPImageView = {
let imageView = SPImageView()
return imageView
}()
private lazy var controlView: SPPlayerControlView = {
let view = PlayerControlViewClass.init()
view.panProgressFinishBlock = { [weak self] progress in
guard let self = self else { return }
let duration = CGFloat(self.player.duration)
let toTime = progress * duration
self.player.seekToTime(toTime: Int(toTime))
}
return view
}()
override init(frame: CGRect) {
super.init(frame: frame)
sp_setupUI()
}
@MainActor required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK: SPPlayerProtocol
var model: Any? {
didSet {
self.controlView.progress = 0
self.coverImageView.isHidden = false
// if let model = model as? SPShortModel {
// self.controlView.model = model
// coverImageView.sp_setImage(url: model.image_url)
// } else if let model = model as? SPVideoDetailModel {
// self.controlView.model = model.shortPlayInfo
// coverImageView.sp_setImage(url: model.shortPlayInfo?.image_url)
// }
}
}
var shortModel: SPShortModel? {
didSet {
self.controlView.shortModel = shortModel
coverImageView.sp_setImage(url: shortModel?.image_url)
}
}
var videoInfo: SPVideoInfoModel? {
didSet {
self.controlView.progress = 0
// self.coverImageView.isHidden = false
self.controlView.currentTime = 0
self.controlView.durationTime = 0
self.controlView.videoInfo = videoInfo
player.setPlayUrl(url: videoInfo?.video_url ?? "")
}
}
var isCurrent: Bool = false {
didSet {
controlView.isCurrent = isCurrent
if !isCurrent {
// self.player.replay()
self.player.seekToTime(toTime: 0)
self.coverImageView.isHidden = false
}
}
}
var rate: Float {
set {
return player.rate = newValue
}
get {
return player.rate
}
}
///
var playerFinishHadle: (() -> Void)?
func prepare() {
// player.prepare()
}
func start() {
player.start()
}
func pause() {
player.pause()
}
func replay() {
player.replay()
}
}
extension SPPlayerListCell {
private func sp_setupUI() {
contentView.addSubview(playerView)
contentView.addSubview(coverImageView)
contentView.addSubview(controlView)
coverImageView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
playerView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
controlView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
}
//MARK: -------------- SPPlayerDelegate --------------
extension SPPlayerListCell: SPPlayerDelegate {
func sp_playCompletion(_ player: SPPlayer) {
self.playerFinishHadle?()
}
func sp_playLoadingEnd(_ player: SPPlayer) {
}
func sp_playTimeChanged(_ player: SPPlayer, currentTime: Int, duration: Int) {
controlView.progress = CGFloat(currentTime) / CGFloat(duration)
controlView.currentTime = currentTime
controlView.durationTime = duration
}
func sp_firstRenderedStart(_ player: SPPlayer) {
}
func sp_player(_ player: SPPlayer, playStateDidChanged state: SPPlayer.PlayState) {
if state == .playing {
self.coverImageView.isHidden = true
}
}
}