有几个S.O.关于CA Shape Layers无法成功设置动画的问题,我已经仔细研究了一下,但是我无法弄清楚我的错误是什么(尽管我认为这是对如何使用CA Layers的基本误解。
我正在尝试在屏幕上绘制3个圆,并在调用方法时将其填满。
在自定义UIView中,在我的设置中,我有以下代码:
class ProgressBar: UIView {
private var bubbles: [CAShapeLayer] = [CAShapeLayer(), CAShapeLayer(), CAShapeLayer()]
private var positions: [CGFloat] = [0.25, 0.50, 0.75]
private var mainRect = CAShapeLayer()
private var progRect = CAShapeLayer()
func setup() {
self.isOpaque = false
self.backgroundColor = UIColor.clear
// initialize the main rectangle
mainRect.fillColor = secondary.cgColor
mainRect.strokeColor = primary.cgColor
self.layer.addSublayer(mainRect)
// initialize the "progress" part
progRect.fillColor = primary.cgColor
progRect.strokeColor = secondary.cgColor
self.layer.addSublayer(progRect)
// initialize the bubbles
for i in 0...2 {
bubbles[i].fillColor = (CGFloat(progress) < positions[i]) ? secondary.cgColor : primary.cgColor
bubbles[i].strokeColor = (CGFloat(progress) < positions[i]) ? primary.cgColor : secondary.cgColor
self.layer.addSublayer(bubbles[i])
}
}
然后,当布局更改时,我只需为layoutSubviews中的每一层修改cgPath。
[尝试制作动画时,我在自定义UIView上调用此方法:
func fillCircle() {
let newFill: CABasicAnimation = CABasicAnimation(keyPath: "fillColor")
newFill.fromValue = secondary
newFill.toValue = primary
newFill.duration = 2
bubbles[0].add(newFill, forKey: "fillColor")
}
任何人都可以指出我可能出了什么问题吗?
回答-不幸的是,问题在于newFill.fromColor需要Any吗?对象,而我正在将它传递给UIColor对象,而它需要cgColor对象。