动画CALayer背景颜色并更新模型值

时间:2015-03-15 18:42:43

标签: ios swift animation calayer cabasicanimation

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

我需要从图层的当前背景颜色动画几次到新的色调颜色(每次都有不同的色调),因此需要更新backgroundColor的模型值(我无法使用)动画上的removedOnCompletion = false

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

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

如何更新backgroundColor模型值并使我的淡入淡出动画保持有效?

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()
}

1 个答案:

答案 0 :(得分:4)

对动画使用明确的fromValue

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

}