// // SPPlayerListCell.swift // ShortPlay // // Created by 曾觉新 on 2025/4/9. // import UIKit class SPPlayerListCell: SPCollectionViewCell, SPPlayerProtocol { 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 { guard let model = model as? SPShortModel else { return } player.setPlayUrl(url: model.video_info?.video_url ?? "") coverImageView.sp_setImage(url: model.image_url) } } var isCurrent: Bool = false ///播放完成 var playerFinishHadle: (() -> Void)? func prepare() { // player.prepare() } func start() { player.start() } func pause() { player.pause() } } extension SPPlayerListCell { private func sp_setupUI() { contentView.addSubview(coverImageView) contentView.addSubview(playerView) 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) { } 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) { } }