CNLivePlayerProgressSlider.swift 5.1 KB
//
//  CNLivePlayerProgressSlider.swift
//  metaCode
//
//  Created by zx on 2023/11/27.
//

import Foundation

class CNLivePlayerProgressSlider:UIView{
    
    // MARK: - 属性
    /// 全部进度颜色
    var _totalColor:UIColor?
    var totalColor:UIColor?{
        get{
            _totalColor
        }
        set{
            _totalColor = newValue
            self.totalView?.backgroundColor = (_totalColor != nil) ? _totalColor : UIColor(white: 1, alpha: 0.2)
        }
    }
    /// 缓冲进度颜色
    var _bufferColor:UIColor?
    var bufferColor:UIColor?{
        get {
            _bufferColor
        }
        set{
            _bufferColor = newValue
            self.bufferView?.backgroundColor = (_bufferColor != nil) ? _bufferColor : UIColor(white: 1, alpha: 0.4)
        }
    }
    /// 当前进度颜色
    var _currentColor:UIColor?
    var currentColor:UIColor?{
        get{
            _currentColor
        }
        set{
            _currentColor = newValue
            self.slider?.minimumTrackTintColor = (_currentColor != nil) ? _currentColor : UIColor(white: 1, alpha: 1)
        }
    }

    /// 缓冲 0~1
    var _bufferValue:CGFloat = 0.0
    var bufferValue:CGFloat{
        get{
            _bufferValue
        }
        set{
            _bufferValue = newValue
            if (_bufferValue > 1) {
                _bufferValue = 1
            }else if (_bufferValue < 0) {
                _bufferValue = 0
            }
            var bufferViewFrame = self.bufferView?.frame
            bufferViewFrame?.size.width = self.width*_bufferValue
            self.bufferView?.frame = bufferViewFrame!
        }
    }
    
    /// 进度 0~1
    var _value:CGFloat = 0.0
    var value:CGFloat{
        get{
            _value
        }
        set{
            _value = newValue
            if (_value > 1) {
                _value = 1
            }else if (_value < 0) {
                _value = 0
            }
            if !self.isDraggingSlideBlock{
                self.slider?.value = Float(_value)
            }
        }
    }

    // MARK: - 回调
    /// 滑动中回调
    var changeSliderValueCallBack:changeSliderValueCallBackBlock?
    /// 结束滑动回调
    var endChangeSliderValueCallBack:endChangeSliderValueCallBackBlock?
    //总进度view
    var totalView:UIView?
    //缓冲view
    var bufferView:UIView?
    //滑块
    var slider:CNLivePlayerSlider?
    //是否在拖动滑块
    var isDraggingSlideBlock:Bool = false

    // MARK: - init
    init() {
        super.init(frame: CGRectZero)
        self.backgroundColor = .clear
        self.initUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        self.totalView?.frame = CGRect(x: 0, y: (self.height-self.slider!.sliderHeight)/2, width: self.width, height: self.slider!.sliderHeight)
        self.bufferView?.frame = CGRect(x: 0, y: (self.height-self.slider!.sliderHeight)/2, width: self.width*self.bufferValue, height: self.slider!.sliderHeight)
        self.slider?.frame = self.bounds
    }

    // MARK: - initUI
    func initUI(){
        self.totalView = UIView()
        self.totalView?.backgroundColor = (self.totalColor != nil) ? self.totalColor : UIColor(white: 1, alpha: 0.2)
        self.addSubview(self.totalView!)
        
        self.bufferView = UIView()
        self.bufferView?.backgroundColor = (self.bufferColor != nil) ? self.bufferColor : UIColor(white: 1, alpha: 0.4)
        self.addSubview(self.bufferView!)
        
        self.slider = CNLivePlayerSlider()
        self.slider!.minimumTrackTintColor = (self.currentColor != nil) ? self.currentColor : UIColor(white: 1, alpha: 1)
        self.slider!.maximumTrackTintColor = .clear
        self.slider?.setThumbImage(self.getSlideBlockImage(), for: .normal)
        self.slider?.addTarget(self, action: #selector(sliderWillDragging), for: .touchDown)
        self.slider?.addTarget(self, action: #selector(sliderValueChanged), for: .valueChanged)
        self.slider?.addTarget(self, action: #selector(sliderEndDragging), for: .touchUpInside)
        self.slider?.addTarget(self, action: #selector(sliderEndDragging), for: .touchUpOutside)
        self.addSubview(self.slider!)
    }
    // MARK: - 触发事件
    @objc func sliderWillDragging(){
        self.isDraggingSlideBlock = true
    }

    @objc func sliderValueChanged(){
        self.changeSliderValueCallBack!(CGFloat(self.slider!.value))
        
    }

    @objc func sliderEndDragging(){
        self.isDraggingSlideBlock = false
        self.endChangeSliderValueCallBack!(CGFloat(self.slider!.value))
    }

    // MARK: - 获取滑块图片
    func getSlideBlockImage()->UIImage{

        UIGraphicsBeginImageContextWithOptions(CGSizeMake(18, 18), false, 0)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(UIColor.white.cgColor)
        let rect = CGRect(x: 0, y: 0, width: 18, height: 18)
        context?.addEllipse(in: rect)
        context?.fillPath()
        let image = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
        return image
    }
}