可以为CALayer的alpha设置动画,但不能为backgroundColor设置动画

时间:2015-06-18 17:34:22

标签: swift cabasicanimation

我想为图层的背景颜色设置动画。 我能够为alpha设置动画,但无法为背景颜色设置动画。

使用:

var animation = CABasicAnimation(keyPath: "opacity")
animation.toValue = 0.6
animation.duration = 0.1
customCALayer.addAnimation(animation, forKey: nil)

不起作用(没有动画,没有错误):

var animation = CABasicAnimation(keyPath: "backgroundColor")
animation.fromValue = UIColor.redColor().CGColor
animation.toValue   = UIColor.whiteColor().CGColor
animation.duration = 0.1
customCALayer.addAnimation(animation, forKey: nil)

这笔交易是什么? backgroundColor is an animatable property

我已经阅读了几篇关于此的帖子,并且不明白我错过了什么。对于noop动画缺乏反馈是具有挑战性的,我不确定它在哪里出错。我已经尝试使用AnyObject作为包装器投射到NSValue,并且没有到达任何地方。

相关答案(对我不起作用):

1 个答案:

答案 0 :(得分:1)

您的动画基本上是正确的,即使同时Swift版本已过时。当前版本看起来像这样:

let animation = CABasicAnimation(keyPath: "backgroundColor")
animation.fromValue = UIColor.red.cgColor
animation.toValue   = UIColor.white.cgColor
animation.duration = 0.1
customCALayer.add(animation, forKey: nil)

如果图层的背景颜色不是白色,则动画后该图层将恢复为原始颜色。可以通过进行一些小的更改来避免这种情况:

customCALayer.backgroundColor = UIColor.white.cgColor // This step isn't necessary if the Layer is white already.
let animation = CABasicAnimation(keyPath: "backgroundColor")
animation.fromValue = UIColor.red.cgColor
animation.duration = 0.1
customCALayer.add(animation, forKey: nil)

动画将颜色从红色更改为白色,动画后该图层保持白色。

在许多情况下,隐式动画足以应付此类情况:

CATransaction.begin()
CATransaction.setAnimationDuration(0.1)
customCALayer.backgroundColor = UIColor.white.cgColor
CATransaction.commit()

使用隐式动画,您还可以轻松创建多个并行动画。例如背景颜色和不透明度:

CATransaction.begin()
CATransaction.setAnimationDuration(0.1)
customCALayer.backgroundColor = UIColor.white.cgColor
customCALayer.opacity = 0.0
CATransaction.commit()