MoviaBox/ShortPlay/Class/Player/View/SPPlayerControlView.swift
2025-04-14 16:32:48 +08:00

169 lines
4.5 KiB
Swift

//
// SPPlayerControlView.swift
// ShortPlay
//
// Created by on 2025/4/9.
//
import UIKit
class SPPlayerControlView: UIView {
weak var viewModel: SPPlayerListViewModel? {
didSet {
viewModel?.addObserver(self, forKeyPath: "isPlaying", context: nil)
}
}
var model: Any? {
didSet {
guard let model = model as? SPShortModel else { return }
}
}
///
var panProgressFinishBlock: ((_ progress: CGFloat) -> Void)?
///0-1
var progress: CGFloat = 0 {
didSet {
progressView.progress = progress
}
}
var isCurrent: Bool = false {
didSet {
updatePlayIconState()
}
}
private(set) lazy var progressView: SPPlayerProgressView = {
let view = SPPlayerProgressView()
view.panStart = { [weak self] in
guard let self = self else { return }
self.panProgressStart()
}
view.panChange = { [weak self] progress in
guard let self = self else { return }
self.panProgressChange(progress: progress)
}
view.panFinish = { [weak self] progress in
guard let self = self else { return }
self.panProgressFinish(progress: progress)
}
return view
}()
private lazy var playImageView: UIImageView = {
let imageView = UIImageView()
imageView.backgroundColor = .red
imageView.isHidden = true
return imageView
}()
deinit {
viewModel?.removeObserver(self, forKeyPath: "isPlaying")
}
override init(frame: CGRect) {
super.init(frame: frame)
let tap = UITapGestureRecognizer(target: self, action: #selector(hadlePlayAndOrPaused))
self.addGestureRecognizer(tap)
sp_setupUI()
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "isPlaying" {
updatePlayIconState()
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension SPPlayerControlView {
private func sp_setupUI() {
addSubview(progressView)
addSubview(playImageView)
progressView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(10)
make.centerX.equalToSuperview()
make.bottom.equalToSuperview().offset(-20)
make.height.equalTo(30)
}
playImageView.snp.makeConstraints { make in
make.center.equalToSuperview()
make.width.height.equalTo(100)
}
}
}
extension SPPlayerControlView {
private func updatePlayIconState() {
let isPlaying = self.viewModel?.isPlaying ?? false
if isCurrent {
playImageView.isHidden = isPlaying
} else {
playImageView.isHidden = true
}
}
@objc private func hadlePlayAndOrPaused() {
self.viewModel?.handlePauseOrPlay?()
// guard let model = model as? SPShortModel else { return }
// let vc = SPTVPlayerListViewController()
// vc.shortPlayId = model.short_play_id
// vc.videoId = model.video_info?.short_play_video_id
// SPAPPTool.topViewController()?.navigationController?.pushViewController(vc, animated: true)
}
}
extension SPPlayerControlView {
///
private func panProgressStart() {
// self.isHidden = true
// screenProgressView.duration = self.player?.duration ?? 0
// screenProgressView.frame = self.window?.bounds ?? .zero
//
// self.window?.addSubview(screenProgressView)
//
// var point = self.progressView.convert(CGPoint(x: 0, y: 0), to: self.window)
// point.y = point.y + self.progressView.size.height - self.progressView.lineWidth / 2
//
// screenProgressView.point = point
}
///
private func panProgressChange(progress: CGFloat) {
// screenProgressView.progress = progress
}
///
private func panProgressFinish(progress: CGFloat) {
// self.isHidden = false
// screenProgressView.removeFromSuperview()
self.panProgressFinishBlock?(progress)
}
}