169 lines
4.5 KiB
Swift
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)
|
|
}
|
|
}
|