动画化 CALayer 背景颜色并更新模型值
Animating CALayer background color and update model value
我想在我的 UIView(在 tintColorDidChange
上)为子层设置 backgroundColor
动画变化。
我需要多次将图层的当前背景颜色设置为新的色调(每次不同的色调),因此需要更新 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()
}
为动画使用明确的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
}
我想在我的 UIView(在 tintColorDidChange
上)为子层设置 backgroundColor
动画变化。
我需要多次将图层的当前背景颜色设置为新的色调(每次不同的色调),因此需要更新 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()
}
为动画使用明确的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
}