|
@@ -16,10 +16,17 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
private var player: AVPlayer?
|
|
|
private var playerLayer: AVPlayerLayer?
|
|
|
private var timeObserverToken: Any?
|
|
|
- private var isPlaying = false
|
|
|
+ private var isPlaying = false{
|
|
|
+ didSet{
|
|
|
+ playPauseButton.setImage(isPlaying ? .videoPause : .videoPlay, for: .normal)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
private let videoURL: URL
|
|
|
|
|
|
+
|
|
|
+ public var isRunloppPlay:Bool = false
|
|
|
+
|
|
|
// MARK: - UI Components
|
|
|
private lazy var playerContainerView: UIView = {
|
|
|
let view = UIView()
|
|
@@ -27,24 +34,20 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
return view
|
|
|
}()
|
|
|
|
|
|
- private lazy var playPauseButton: UIButton = {
|
|
|
- let button = UIButton()
|
|
|
- button.setImage(UIImage(named: "play"), for: .normal)
|
|
|
+ private lazy var playPauseButton: TSUIExpandedTouchButton = {
|
|
|
+ let button = TSUIExpandedTouchButton()
|
|
|
+ button.setImage(.videoPlay, for: .normal)
|
|
|
button.tintColor = .white
|
|
|
-// button.addTarget(self, action: #selector(playPauseTapped), for: .touchUpInside)
|
|
|
- button.isUserInteractionEnabled = false
|
|
|
+ button.addTarget(self, action: #selector(playPauseTapped), for: .touchUpInside)
|
|
|
return button
|
|
|
}()
|
|
|
|
|
|
+
|
|
|
private lazy var progressSlider: TSProgressSlider = {
|
|
|
let slider = TSProgressSlider()
|
|
|
slider.minimumTrackTintColor = UIColor.themeColor
|
|
|
slider.maximumTrackTintColor = .white.withAlphaComponent(0.2)
|
|
|
-// slider.thumbTintColor = UIColor.white
|
|
|
-// slider.setMinimumTrackImage(UIImage(color: UIColor.themeColor, size: CGSize(width: 1, height: 3)), for: .normal)
|
|
|
-// slider.setMaximumTrackImage(UIImage(color: .white.withAlphaComponent(0.2), size: CGSize(width: 1, height: 3)), for: .normal)
|
|
|
slider.setThumbImage(UIImage.circle(diameter: 10, color: .white), for: .normal)
|
|
|
-
|
|
|
slider.addTarget(self, action: #selector(sliderValueChanged(_:)), for: .valueChanged)
|
|
|
slider.addTarget(self, action: #selector(sliderTouchEnded(_:)), for: .touchUpInside)
|
|
|
slider.addTarget(self, action: #selector(sliderTouchEnded(_:)), for: .touchUpOutside)
|
|
@@ -81,6 +84,18 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
super.viewDidLoad()
|
|
|
setupUI()
|
|
|
setupPlayer()
|
|
|
+
|
|
|
+
|
|
|
+ dealThings()
|
|
|
+ }
|
|
|
+
|
|
|
+ func dealThings() {
|
|
|
+ // 监听应用生命周期事件
|
|
|
+ NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { _ in
|
|
|
+ self.playPause()
|
|
|
+ self.setControlsView(isHidden: false)
|
|
|
+ }
|
|
|
+ NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main) { _ in }
|
|
|
}
|
|
|
|
|
|
override func viewDidLayoutSubviews() {
|
|
@@ -92,18 +107,28 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
removePeriodicTimeObserver()
|
|
|
}
|
|
|
|
|
|
+ @objc private func clickBgView() {
|
|
|
+ setControlsView(isHidden: !controlsContainerView.isHidden)
|
|
|
+ }
|
|
|
+
|
|
|
+ func setControlsView(isHidden:Bool) {
|
|
|
+ playPauseButton.isHidden = isHidden
|
|
|
+ controlsContainerView.isHidden = isHidden
|
|
|
+ }
|
|
|
+
|
|
|
// MARK: - Setup
|
|
|
private func setupUI() {
|
|
|
-// view.backgroundColor = "#111111".uiColor
|
|
|
view.backgroundColor = .clear
|
|
|
- playerContainerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(playPauseTapped)))
|
|
|
+ playerContainerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickBgView)))
|
|
|
view.addSubview(playerContainerView)
|
|
|
- playerContainerView.addSubview(playPauseButton)
|
|
|
+
|
|
|
|
|
|
playerContainerView.snp.makeConstraints { make in
|
|
|
make.edges.equalToSuperview()
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+ playerContainerView.addSubview(playPauseButton)
|
|
|
playPauseButton.snp.makeConstraints { make in
|
|
|
make.centerX.equalToSuperview()
|
|
|
make.centerY.equalToSuperview()//.offset(-50)
|
|
@@ -121,8 +146,8 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
controlsContainerView.addSubview(durationLabel)
|
|
|
|
|
|
progressSlider.snp.makeConstraints { make in
|
|
|
- make.leading.equalTo(16)
|
|
|
- make.trailing.equalTo(-16)
|
|
|
+ make.left.equalTo(16)
|
|
|
+ make.right.equalTo(-16)
|
|
|
make.top.equalTo(0)
|
|
|
make.height.equalTo(10)
|
|
|
}
|
|
@@ -139,13 +164,13 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
currentTimeLabel.snp.makeConstraints { make in
|
|
|
make.height.equalTo(13)
|
|
|
make.centerY.equalTo(label)
|
|
|
- make.trailing.equalTo(label.snp.leading)
|
|
|
+ make.right.equalTo(label.snp.left)
|
|
|
}
|
|
|
|
|
|
durationLabel.snp.makeConstraints { make in
|
|
|
make.height.equalTo(13)
|
|
|
make.centerY.equalTo(label)
|
|
|
- make.leading.equalTo(label.snp.trailing)
|
|
|
+ make.left.equalTo(label.snp.right)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -180,6 +205,11 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ func runloppPlay() {
|
|
|
+ self.isRunloppPlay = true
|
|
|
+ setControlsView(isHidden: true)
|
|
|
+ playPlay()
|
|
|
+ }
|
|
|
// MARK: - Player Controls
|
|
|
@objc private func playPauseTapped() {
|
|
|
if isPlaying {
|
|
@@ -189,17 +219,13 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @objc private func playPlay() {
|
|
|
+ @objc func playPlay() {
|
|
|
player?.play()
|
|
|
- playPauseButton.isHidden = true
|
|
|
-// playPauseButton.setImage(UIImage(named: "pause"), for: .normal)
|
|
|
isPlaying = true
|
|
|
}
|
|
|
|
|
|
@objc func playPause() {
|
|
|
player?.pause()
|
|
|
- playPauseButton.isHidden = false
|
|
|
-// playPauseButton.setImage(UIImage(named: "play"), for: .normal)
|
|
|
isPlaying = false
|
|
|
}
|
|
|
|
|
@@ -211,11 +237,13 @@ class TSAIListVideoPlayerVC: UIViewController {
|
|
|
|
|
|
func playerDidFinish() {
|
|
|
player?.seek(to: CMTime.zero)
|
|
|
- playPauseButton.isHidden = false
|
|
|
-// playPauseButton.setImage(UIImage(named: "play"), for: .normal)
|
|
|
isPlaying = false
|
|
|
progressSlider.value = 0
|
|
|
currentTimeLabel.text = "00:00"
|
|
|
+
|
|
|
+ if isRunloppPlay {
|
|
|
+ playPlay()
|
|
|
+ }
|
|
|
}
|
|
|
// MARK: - Progress Slider
|
|
|
@objc private func sliderValueChanged(_ sender: UISlider) {
|