|
@@ -0,0 +1,171 @@
|
|
|
|
+//
|
|
|
|
+// PQSlideView.swift
|
|
|
|
+// PQSpeed
|
|
|
|
+//
|
|
|
|
+// Created by SanW on 2020/6/3.
|
|
|
|
+// Copyright © 2020 BytesFlow. All rights reserved.
|
|
|
|
+//
|
|
|
|
+
|
|
|
|
+import UIKit
|
|
|
|
+
|
|
|
|
+class PQPlayerSlider: UISlider {
|
|
|
|
+ override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
|
|
|
|
+ var newRect = rect
|
|
|
|
+
|
|
|
|
+ newRect.origin.x = newRect.origin.x - 5
|
|
|
|
+ newRect.size.width = newRect.size.width + 10
|
|
|
|
+ return super.thumbRect(forBounds: bounds, trackRect: newRect, value: value)
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+class PQSlideView: UIView {
|
|
|
|
+ /// 拖动进度
|
|
|
|
+ public var valueChangeBloc: ((_ slideer: UISlider) -> Void)?
|
|
|
|
+ public var btnClickBloc: ((_ sender: UIButton) -> Void)?
|
|
|
|
+ public var isDragingProgressSlder: Bool = false
|
|
|
|
+
|
|
|
|
+ public lazy var playerBtn: UIButton = {
|
|
|
|
+ let playerBtn = UIButton()
|
|
|
|
+ playerBtn.setImage(UIImage(named: "icon_video_stop"), for: .normal)
|
|
|
|
+ playerBtn.setImage(UIImage(named: "icon_video_play"), for: .selected)
|
|
|
|
+ playerBtn.tag = 1
|
|
|
|
+ playerBtn.addTarget(self, action: #selector(btnClick(sender:)), for: .touchUpInside)
|
|
|
|
+ return playerBtn
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ public lazy var fullScreenBtn: UIButton = {
|
|
|
|
+ let fullScreenBtn = UIButton()
|
|
|
|
+ fullScreenBtn.setImage(UIImage(named: "icon_video_narrow"), for: .selected)
|
|
|
|
+ fullScreenBtn.setImage(UIImage(named: "icon_video_amplification"), for: .normal)
|
|
|
|
+ fullScreenBtn.tag = 2
|
|
|
|
+ fullScreenBtn.addTarget(self, action: #selector(btnClick(sender:)), for: .touchUpInside)
|
|
|
|
+ return fullScreenBtn
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ public lazy var sliderView: PQPlayerSlider = {
|
|
|
|
+ let sliderView = PQPlayerSlider()
|
|
|
|
+ let thbImage = UIImage(named: "icon_point")
|
|
|
|
+ sliderView.setMinimumTrackImage(thbImage, for: .normal)
|
|
|
|
+ sliderView.setMaximumTrackImage(thbImage, for: .normal)
|
|
|
|
+ sliderView.setThumbImage(thbImage, for: .highlighted)
|
|
|
|
+ sliderView.setThumbImage(thbImage, for: .normal)
|
|
|
|
+ sliderView.maximumTrackTintColor = UIColor.hexColor(hexadecimal: "#666666")
|
|
|
|
+ sliderView.minimumTrackTintColor = UIColor.white
|
|
|
|
+ sliderView.addTarget(self, action: #selector(sliderTouchBegan(sender:)), for: .touchDown)
|
|
|
|
+ sliderView.addTarget(self, action: #selector(sliderTouchEnded(sender:)), for: .touchUpInside)
|
|
|
|
+ sliderView.addTarget(self, action: #selector(sliderTouchEnded(sender:)), for: .touchUpOutside)
|
|
|
|
+ sliderView.addTarget(self, action: #selector(sliderTouchEnded(sender:)), for: .touchCancel)
|
|
|
|
+ return sliderView
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ public lazy var currentTimeLab: UILabel = {
|
|
|
|
+ let currentTimeLab = UILabel()
|
|
|
|
+ currentTimeLab.text = "00:00"
|
|
|
|
+ currentTimeLab.textColor = UIColor.white
|
|
|
|
+ currentTimeLab.font = UIFont.systemFont(ofSize: 12)
|
|
|
|
+ return currentTimeLab
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ public lazy var totalLab: UILabel = {
|
|
|
|
+ let totalLab = UILabel()
|
|
|
|
+ totalLab.textColor = UIColor.white
|
|
|
|
+ totalLab.text = "00:00"
|
|
|
|
+ totalLab.font = UIFont.systemFont(ofSize: 12)
|
|
|
|
+ return totalLab
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ override public init(frame: CGRect) {
|
|
|
|
+ super.init(frame: frame)
|
|
|
|
+ addSubview(playerBtn)
|
|
|
|
+ addSubview(currentTimeLab)
|
|
|
|
+ addSubview(sliderView)
|
|
|
|
+ addSubview(totalLab)
|
|
|
|
+ addSubview(fullScreenBtn)
|
|
|
|
+ addLayout()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public required init?(coder _: NSCoder) {
|
|
|
|
+ fatalError("init(coder:) has not been implemented")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public var progressValue: Float = 0 {
|
|
|
|
+ didSet {
|
|
|
|
+ if !isDragingProgressSlder {
|
|
|
|
+ addData()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public var duration: Float = 0 {
|
|
|
|
+ didSet {
|
|
|
|
+ if !isDragingProgressSlder {
|
|
|
|
+ addData()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ override public func layoutSubviews() {
|
|
|
|
+ super.layoutSubviews()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public func addData() {
|
|
|
|
+ if progressValue >= 3600 {
|
|
|
|
+ currentTimeLab.snp.updateConstraints { make in
|
|
|
|
+ make.width.greaterThanOrEqualTo(54)
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ currentTimeLab.snp.updateConstraints { make in
|
|
|
|
+ make.width.greaterThanOrEqualTo(35)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ sliderView.setValue(progressValue / duration, animated: false)
|
|
|
|
+ currentTimeLab.text = Float64(progressValue).formatDurationToHMS()
|
|
|
|
+ totalLab.text = Float64(duration).formatDurationToHMS()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public func addLayout() {
|
|
|
|
+ playerBtn.snp.makeConstraints { make in
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.height.width.equalTo(cDefaultMargin * 4)
|
|
|
|
+ make.left.equalTo(self)
|
|
|
|
+ }
|
|
|
|
+ currentTimeLab.snp.makeConstraints { make in
|
|
|
|
+ make.left.equalTo(playerBtn.snp.right).offset(cDefaultMargin)
|
|
|
|
+ make.width.greaterThanOrEqualTo(35)
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ }
|
|
|
|
+ fullScreenBtn.snp.makeConstraints { make in
|
|
|
|
+ make.right.equalTo(self)
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.width.height.equalTo(cDefaultMargin * 4)
|
|
|
|
+ }
|
|
|
|
+ totalLab.snp.makeConstraints { make in
|
|
|
|
+ make.right.equalTo(fullScreenBtn.snp.left).offset(-cDefaultMargin)
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ }
|
|
|
|
+ sliderView.snp.makeConstraints { make in
|
|
|
|
+ make.left.equalTo(currentTimeLab.snp.right).offset(cDefaultMargin)
|
|
|
|
+ make.right.equalTo(totalLab.snp.left).offset(-cDefaultMargin)
|
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
|
+ make.height.equalTo(cDefaultMargin * 4)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc public func sliderTouchBegan(sender _: UISlider) {
|
|
|
|
+ isDragingProgressSlder = true
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc public func sliderTouchEnded(sender: UISlider) {
|
|
|
|
+ if valueChangeBloc != nil {
|
|
|
|
+ valueChangeBloc!(sender)
|
|
|
|
+ }
|
|
|
|
+ isDragingProgressSlder = false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @objc public func btnClick(sender: UIButton) {
|
|
|
|
+ if btnClickBloc != nil {
|
|
|
|
+ sender.isSelected = !sender.isSelected
|
|
|
|
+ btnClickBloc!(sender)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|