您不能在单个 UIView.animateWithDuration 调用中为同一属性设置多个状态更改的动画。它只会动画到最后的状态变化(就像你的情况一样)。相反,您可以使用 completionBlock 将它们链接在一起。
UIView.animateWithDuration(5/3.0, animations: {
self.view.backgroundColor = UIColor.yellowColor()
}, completion:{ finished1 in
UIView.animateWithDuration(5/3.0, animations: {
self.view.backgroundColor = UIColor.blueColor()
}, completion:{finished2 in
UIView.animateWithDuration(5/3.0, animations: {
self.view.backgroundColor = UIColor.purpleColor()
}, completion:{finished3 in
println("COLOR CHANGED")
})
})
})
或者您可以使用关键帧动画,指定中间帧,如下所示。 relativeDuration 应该是一个介于 0 和 1 之间的值,表示一个关键帧的相对持续时间。例如,如果整个动画是3 seconds 并且relativeDuration 是(1/3),那么该关键帧将动画3/3 = 1 秒。
relativeStartTime 类似地是关键帧开始之后相对于整个动画持续时间的相对时间。例如,如果整个动画是3 seconds,relativeStartTime 是(1/3),那么该关键帧将在1 second 之后开始
var duration = 5.0;
var relativeDuration = 1.0/3;
UIView.animateKeyframesWithDuration(duration, delay: 0, options: nil, animations: {
UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: relativeDuration, animations: {
self.view.backgroundColor = UIColor.yellowColor()
})
UIView.addKeyframeWithRelativeStartTime(relativeDuration, relativeDuration: relativeDuration, animations: {
self.view.backgroundColor = UIColor.blueColor()
})
UIView.addKeyframeWithRelativeStartTime(2 * relativeDuration, relativeDuration: relativeDuration, animations: {
self.view.backgroundColor = UIColor.purpleColor()
})
}, completion:nil);