// // 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) } }