CNLivePlayerLoadingView.swift
3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//
// CNLivePlayerLoadingView.swift
// metaCode
//
// Created by zx on 2023/11/24.
//
import Foundation
class CNLivePlayerLoadingView:UIView,CAAnimationDelegate{
/**
是否在加载中
*/
var _isLoading:Bool?
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()
}
}
}