| 
					
				 | 
			
			
				@@ -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) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |