关于ios:对CALayer背景颜色进行动画处理并更新模型值

Animating CALayer background color and update model value

我想为UIView中的子图层(在tintColorDidChange上)的backgroundColor更改动画。

我需要多次将图层的当前背景色设置为新的着色色(每次使用不同的着色色),因此需要更新backgroundColor的模型值(我不能在动画上使用removedOnCompletion = false )。

使用CABasicAnimation,如果我不更新模型值(我当然会在完成动画后重置颜色),则可以使变色动画正常工作。
当我尝试更新模型值时,颜色会立即发生变化,并且动画会丢失。

我尝试禁用隐式动画并使用CATransation更新模型值,但动画仍然丢失。

如何更新backgroundColor模型值并保持淡入淡出动画正常工作?

1
2
3
4
5
6
7
8
9
10
11
12
13
override func tintColorDidChange() {
    super.tintColorDidChange()

    let colourAnim = CABasicAnimation(keyPath:"backgroundColor")
    colourAnim.toValue = self.tintColor.CGColor
    colourAnim.duration = 1.0
    self.spinnerLayer?.addAnimation(colourAnim, forKey:"colourAnimation")

    CATransaction.begin()
    CATransaction.setDisableActions(true)
    self.spinnerLayer?.backgroundColor = self.tintColor.CGColor
    CATransaction.commit()
}

为动画使用明确的fromValue

1
2
3
4
5
6
7
8
9
10
11
override func tintColorDidChange() {
    super.tintColorDidChange()

    let colourAnim = CABasicAnimation(keyPath:"backgroundColor")
    colourAnim.fromValue = self.spinnerLayer!.backgroundColor
    colourAnim.toValue = self.tintColor.CGColor
    colourAnim.duration = 1.0
    self.spinnerLayer?.addAnimation(colourAnim, forKey:"colourAnimation")
    self.spinnerLayer?.backgroundColor = self.tintColor.CGColor

}