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

170 lines
3.9 KiB
Swift

//
// SPPlayerListCell.swift
// ShortPlay
//
// Created by on 2025/4/9.
//
import UIKit
class SPPlayerListCell: SPCollectionViewCell, SPPlayerProtocol {
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 = SPPlayerControlView()
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 videoInfo: SPVideoInfoModel? {
didSet {
player.setPlayUrl(url: videoInfo?.video_url ?? "")
}
}
var isCurrent: Bool = false {
didSet {
controlView.isCurrent = isCurrent
}
}
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)
}
func sp_firstRenderedStart(_ player: SPPlayer) {
}
func sp_player(_ player: SPPlayer, playStateDidChanged state: SPPlayer.PlayState) {
if state == .playing {
self.coverImageView.isHidden = true
}
}
}