我已经实现了一个循环加载动画,与此视频中的完全相同:
https://www.youtube.com/watch?v=O3ltwjDJaMk
下面是我的代码:
class ViewController: UIViewController {
let shapeLayer = CAShapeLayer()
override func viewDidLoad() {
super.viewDidLoad()
let center = view.center
let trackLayer = CAShapeLayer()
let circularPath = UIBezierPath(arcCenter: center, radius: 100, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)
trackLayer.path = circularPath.cgPath
trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 10
trackLayer.fillColor = UIColor.clear.cgColor
trackLayer.lineCap = kCALineCapRound
view.layer.addSublayer(trackLayer)
shapeLayer.path = circularPath.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = 10
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.lineCap = kCALineCapRound
shapeLayer.strokeEnd = 0
view.layer.addSublayer(shapeLayer)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
}
@objc private func handleTap() {
let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = 1
basicAnimation.duration = 2
basicAnimation.fillMode = kCAFillModeForwards
basicAnimation.isRemovedOnCompletion = false
shapeLayer.add(basicAnimation, forKey: "urSoBasic")
}
}
当动画发生时,我希望圆圈的颜色从红色变成绿色,如果圆圈完全完成,它应该是绿色的,如果没有,那么一些颜色之间的红色和绿色(取决于变量从用户名)。
1条答案
按热度按时间kulphzqa1#
你也可以使用
CAAnimation
到animate color,所以你可以点击那个链接。缺少的部分是计算
from
和to
颜色,需要根据当前值进行插值。假设您的进度视图将在某个时间点更新界面以具有
然后使用这些值可以计算当前进度,一个介于
0
和1
之间的值,该值应定义颜色插值比例。计算该值的基本数学公式应为:随着进度的推进,您现在可以使用以下公式插入任何数值
但是颜色不是一个数值。在
CAAnimation
的情况下,你应该把它分解成4个数值作为RGBA以保持一致性(至少我相信CAAnimation
在RGBA空间中使用插值来获得颜色)。在许多情况下,当你在HSV空间而不是RGB空间内插时,它看起来更好。因此,对颜色进行插值应如下所示:
这些应该是你制作动画所需要的所有组件,我希望这些组件足以让你走上正确的道路。我个人喜欢有更多的控制权,而且我喜欢避免使用
CAAnimation
甚至是形状层等工具。所以这就是我将如何完成你的任务:请随意使用和修改它,无论你喜欢。