168 lines
5.0 KiB
Swift
168 lines
5.0 KiB
Swift
//
|
|
// SPPlayerDetailControlView.swift
|
|
// ShortPlay
|
|
//
|
|
// Created by 曾觉新 on 2025/4/16.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class SPPlayerDetailControlView: SPPlayerControlView {
|
|
|
|
|
|
override var durationTime: Int {
|
|
didSet {
|
|
updateProgressTimeLabel()
|
|
}
|
|
}
|
|
|
|
override var currentTime: Int {
|
|
didSet {
|
|
updateProgressTimeLabel()
|
|
}
|
|
}
|
|
|
|
override var viewModel: SPPlayerListViewModel? {
|
|
didSet {
|
|
self.viewModel?.addObserver(self, forKeyPath: "speedModel", context: nil)
|
|
updateSpeedButton()
|
|
}
|
|
}
|
|
|
|
override var isCurrent: Bool {
|
|
didSet {
|
|
if isCurrent {
|
|
showSpeedSelectedView(isShow: false)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//MARK: UI属性
|
|
private lazy var episodeButton: UIButton = {
|
|
let button = createFeatureButton(title: "Episodes".localized, image: UIImage(named: "episodes_icon_01"))
|
|
button.addTarget(self, action: #selector(handleEpisodeButton), for: .touchUpInside)
|
|
return button
|
|
}()
|
|
|
|
private lazy var progressTimeLabel: UILabel = {
|
|
let label = UILabel()
|
|
label.font = .fontLight(ofSize: 12)
|
|
label.textColor = .colorFFFFFF(alpha: 0.9)
|
|
return label
|
|
}()
|
|
|
|
private lazy var speedButton: UIButton = {
|
|
let button = UIButton(type: .custom)
|
|
button.setBackgroundImage(UIImage(color: .colorFFFFFF(alpha: 0.2)), for: .normal)
|
|
button.setTitleColor(.colorFFFFFF(alpha: 0.9), for: .normal)
|
|
button.titleLabel?.font = .fontLight(ofSize: 11)
|
|
button.layer.cornerRadius = 10
|
|
button.layer.masksToBounds = true
|
|
button.addTarget(self, action: #selector(handleSpeedButton), for: .touchUpInside)
|
|
return button
|
|
}()
|
|
|
|
private lazy var speedSelectedView: SPSpeedSelectedView = {
|
|
let view = SPSpeedSelectedView()
|
|
view.isHidden = true
|
|
view.didSelectedSpeed = { [weak self] speedModel in
|
|
guard let self = self else { return }
|
|
self.viewModel?.setSpeedPlay(speedModel: speedModel)
|
|
self.showSpeedSelectedView(isShow: false)
|
|
}
|
|
return view
|
|
}()
|
|
|
|
deinit {
|
|
self.viewModel?.removeObserver(self, forKeyPath: "speedModel")
|
|
}
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
|
|
_setupUI()
|
|
}
|
|
|
|
@MainActor required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
|
|
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
|
|
if keyPath == "speedModel" {
|
|
updateSpeedButton()
|
|
}
|
|
|
|
}
|
|
|
|
private func updateProgressTimeLabel() {
|
|
let currentTime = self.currentTime.formatTimeGroup()
|
|
let durationTime = self.durationTime.formatTimeGroup()
|
|
|
|
progressTimeLabel.text = "\(currentTime.1):\(currentTime.2)/\(durationTime.1):\(durationTime.2)"
|
|
}
|
|
|
|
///更新速率按钮
|
|
private func updateSpeedButton() {
|
|
self.speedButton.setTitle(self.viewModel?.speedModel.formatString(), for: .normal)
|
|
}
|
|
}
|
|
|
|
extension SPPlayerDetailControlView {
|
|
|
|
private func _setupUI() {
|
|
self.rightFeatureView.addArrangedSubview(episodeButton)
|
|
|
|
addSubview(progressTimeLabel)
|
|
addSubview(speedButton)
|
|
addSubview(speedSelectedView)
|
|
|
|
self.progressView.snp.remakeConstraints { make in
|
|
make.left.equalToSuperview().offset(15)
|
|
make.centerX.equalToSuperview()
|
|
make.height.equalTo(30)
|
|
make.bottom.equalToSuperview().offset(-(kSPTabbarSafeBottomMargin + 10))
|
|
}
|
|
|
|
self.progressTimeLabel.snp.makeConstraints { make in
|
|
make.left.equalTo(self.progressView)
|
|
make.bottom.equalTo(self.progressView).offset(-12)
|
|
}
|
|
|
|
speedButton.snp.makeConstraints { make in
|
|
make.centerY.equalTo(self.progressTimeLabel)
|
|
make.right.equalToSuperview().offset(-15)
|
|
make.width.equalTo(40)
|
|
make.height.equalTo(20)
|
|
}
|
|
|
|
speedSelectedView.snp.makeConstraints { make in
|
|
make.left.right.equalToSuperview()
|
|
make.bottom.equalTo(self.speedButton.snp.top).offset(-30)
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
extension SPPlayerDetailControlView {
|
|
@objc private func handleEpisodeButton() {
|
|
self.viewModel?.handleEpisode?()
|
|
}
|
|
|
|
@objc private func handleSpeedButton() {
|
|
showSpeedSelectedView(isShow: speedSelectedView.isHidden)
|
|
}
|
|
|
|
///暂时或隐藏速率选择页面
|
|
private func showSpeedSelectedView(isShow: Bool) {
|
|
speedSelectedView.isHidden = !isShow
|
|
rightFeatureView.isHidden = isShow
|
|
|
|
if isShow {
|
|
self.speedSelectedView.currentSpeed = self.viewModel?.speedModel.speed ?? .x1
|
|
}
|
|
}
|
|
}
|