CNLiveShortVideoCustomControlView.swift 6.71 KB
//
//  CNLiveShortVideoCustomControlView.swift
//  metaCode
//
//  Created by open on 2024/1/5.
//

import Foundation
import ZFPlayer

class CNLiveShortVideoCustomControlView: UIView, ZFPlayerMediaControl, ZFSliderViewDelegate {
    
    var player: ZFPlayerController?
        
    var topToolView: UIView = {
        let view = UIView()
        let image = UIImage(named: "ZFPlayer_top_shadow")
        view.layer.contents = image?.cgImage
        return view
    }()
    
    var titleLabel: UILabel = {
        let label = UILabel()
        label.textColor = .white
        label.font = UIFont.systemFont(ofSize: 15.0)
        return label
    }()
    
    var bottomToolView: UIView = {
        let view = UIView()
        let image = UIImage(named: "ZFPlayer_bottom_shadow")
        view.layer.contents = image?.cgImage
        return view
    }()
    
    var playOrPauseBtn: UIButton = {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: "new_allPlay_44x44_"), for: .normal)
        button.setImage(UIImage(named: "new_allPause_44x44_"), for: .selected)
        return button
    }()
    
    var currentTimeLabel: UILabel = {
        let label = UILabel()
        label.textColor = .white
        label.font = UIFont.systemFont(ofSize: 14.0)
        label.textAlignment = .center
        return label
    }()
    
    var slider: ZFSliderView = {
        let slider = ZFSliderView()
        slider.maximumTrackTintColor = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 0.8)
        slider.bufferTrackTintColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5)
        slider.minimumTrackTintColor = .white
        slider.setThumbImage(UIImage(named: "ZFPlayer_slider"), for: .normal)
        slider.sliderHeight = 2
        return slider
    }()
    
    var totalTimeLabel: UILabel = {
        let label = UILabel()
        label.textColor = .white
        label.font = UIFont.systemFont(ofSize: 14.0)
        label.textAlignment = .center
        return label
    }()
    
    var fullScreenBtn: UIButton = {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: "ZFPlayer_fullscreen"), for: .normal)
        return button
    }()
    
    var coverImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.isUserInteractionEnabled = true
        imageView.contentMode = .scaleAspectFit
        return imageView
    }()
    
    var bottomPgrogress: ZFSliderView = {
        let slider = ZFSliderView()
        slider.maximumTrackTintColor = .clear
        slider.minimumTrackTintColor = .white
        slider.bufferTrackTintColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.5)
        slider.sliderHeight = 1
        slider.isHideSliderBlock = false
        return slider
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(topToolView)
        addSubview(bottomToolView)
        addSubview(playOrPauseBtn)
        topToolView.addSubview(titleLabel)
        bottomToolView.addSubview(currentTimeLabel)
        bottomToolView.addSubview(slider)
        bottomToolView.addSubview(totalTimeLabel)
        bottomToolView.addSubview(fullScreenBtn)
        addSubview(bottomPgrogress)
//        addSubview(activity)

//        autoFadeTimeInterval = 0.2
//        autoHiddenTimeInterval = 2.5

        // 设置子控件的响应事件
        makeSubViewsAction()
        
//        resetControlView()
        clipsToBounds = true
    }

    func makeSubViewsAction() {
        playOrPauseBtn.addTarget(self, action: #selector(playPauseButtonClickAction), for: .touchUpInside)
        fullScreenBtn.addTarget(self, action: #selector(fullScreenButtonClickAction), for: .touchUpInside)
    }
    
    
    
    ///////////////  ZFSliderViewDelegate
    func sliderTouchBegan(_ value: Float) {
        slider.isdragging = true
    }
    
    func sliderTouchEnded(_ value: Float) {
        guard player?.totalTime ?? 0.0 > 0 else {
            slider.isdragging = false
            return
        }
        
        player?.seek(toTime: (player?.totalTime ?? 0.0) * TimeInterval(value), completionHandler: {[weak self] finished in
            guard let self = self else { return }
            if finished {
                self.slider.isdragging = false
            }
        })
    }
    
    func sliderValueChanged(_ value: Float) {
        guard player?.totalTime ?? 0.0 > 0 else {
            slider.value = 0
            return
        }
        
        slider.isdragging = true
        let currentTimeString = ZFUtilities.convertTimeSecond(Int((player?.totalTime ?? 0.0) * TimeInterval(value)))
        currentTimeLabel.text = currentTimeString
    }
    
    func sliderTapped(_ value: Float) {
        guard player?.totalTime ?? 0.0 > 0 else {
            slider.isdragging = false
            slider.value = 0
            return
        }
        
        slider.isdragging = true
        player?.seek(toTime: (player?.totalTime ?? 0.0) * TimeInterval(value), completionHandler: { [weak self] finished in
            guard let self = self else { return }
            if finished {
                slider.isdragging = false
                player?.currentPlayerManager.play()
            }
        })
    }
    
    ////////////action
    @objc func playPauseButtonClickAction(_ sender: UIButton) {
        playOrPause()
    }

    @objc func fullScreenButtonClickAction(_ sender: UIButton) {
        self.player?.enterFullScreen(!self.player!.isFullScreen, animated: true)
    }
    
    private func playOrPause() {
        self.playOrPauseBtn.isSelected = !self.playOrPauseBtn.isSelected
        self.playOrPauseBtn.isSelected ? self.player?.currentPlayerManager.play(): self.player?.currentPlayerManager.pause()
    }
    
    private func playBtnSelectedState(selected: Bool) {
        self.playOrPauseBtn.isSelected = selected
    }
    

    ///////private
    func resetControlView() {
        self.bottomToolView.alpha        = 1
        self.slider.value                = 0
        self.slider.bufferValue          = 0
        self.currentTimeLabel.text       = "00:00"
        self.totalTimeLabel.text         = "00:00"
        self.backgroundColor             = .clear
        self.playOrPauseBtn.isSelected     = true
        self.titleLabel.text             = ""
    }
    
//    func showControlView() {
//        self.topToolView.alpha           = 1
//        self.bottomToolView.alpha        = 1
//        self.isShow                      = true
//        self.topToolView.zf_y            = 0
//        self.bottomToolView.zf_y         = self.zf_height - self.bottomToolView.zf_height
//        self.playOrPauseBtn.alpha        = 1
//        self.player.statusBarHidden      = false
//    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        // Initialization code...
    }
}