CNLivePlayerLoadingView.swift 3.36 KB
//
//  CNLivePlayerLoadingView.swift
//  metaCode
//
//  Created by zx on 2023/11/24.
//

import Foundation

class CNLivePlayerLoadingView:UIView,CAAnimationDelegate{
    
    /**
     是否在加载中
     */
    var _isLoading:Bool = false
    var isLoading:Bool?{
        get{
            _isLoading
        }
        set{
            _isLoading = newValue!
        }
    }
    
    // MARK: - loadingLayer
    lazy var loadingLayer :CAShapeLayer = {
        let loadingLayer = CAShapeLayer()
        loadingLayer.lineWidth = 3
        loadingLayer.fillColor = UIColor.clear.cgColor
        loadingLayer.strokeColor = UIColor.white.cgColor
        loadingLayer.lineCap = .round
        return loadingLayer
    }()

    //开始角度
    var beginAngle:CGFloat = 0.0
    //动画角度
    var animateAngle:CGFloat = 0.0
    
    // MARK: - init
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.alpha = 0
        self.beginAngle = 0
        self.animateAngle = .pi*10/3
        self.layer.addSublayer(self.loadingLayer)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    deinit {
        self.stopAnimate()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        let path = UIBezierPath(arcCenter: CGPoint(x: self.width/2, y: self.height/2), radius: self.width/2-3, startAngle: self.beginAngle, endAngle: self.animateAngle, clockwise: true)
        self.loadingLayer.path = path.cgPath
    }

    // MARK: - 动画
    /**
     开启动画
     */
    func startAnimate(){
        self.isLoading = true
        self.loadingLayer.removeAllAnimations()
        self.alpha = 1
        var strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart")
        strokeStartAnimation.fromValue = 0
        strokeStartAnimation.toValue = 1
        strokeStartAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        var strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd")
        strokeEndAnimation.fromValue = 0
        strokeEndAnimation.toValue = 1
        strokeEndAnimation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
        strokeEndAnimation.duration = 1
        
        var strokeAniamtionGroup = CAAnimationGroup()
        strokeAniamtionGroup.duration = 1.5
        strokeAniamtionGroup.fillMode = .forwards
        strokeAniamtionGroup.isRemovedOnCompletion = false
        strokeAniamtionGroup.delegate = self
        strokeAniamtionGroup.animations = [strokeEndAnimation, strokeStartAnimation]
        self.loadingLayer.add(strokeAniamtionGroup, forKey: "strokeAniamtionGroup")
        
    }
    /**
     结束动画
     */
    func stopAnimate(){
        self.isLoading = false
        self.loadingLayer.removeAllAnimations()
        self.beginAngle = 0
        self.alpha = 0
    }

    // MARK: - CAAnimationDelegate
    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
        if self.loadingLayer.animation(forKey: "strokeAniamtionGroup") == anim{
            self.beginAngle = self.beginAngle + self.animateAngle
            let path = UIBezierPath(arcCenter: CGPoint(x: self.width/2, y: self.height/2), radius: self.width/2-3, startAngle: self.beginAngle, endAngle: self.beginAngle+self.animateAngle, clockwise: true)
            self.loadingLayer.path = path.cgPath
            self.startAnimate()
        }
    }
}