UIView动画跳过第一个动画

UIView animation skips first animation

很新,抱歉!

只要我运行按下按钮"press"UIView的背景色"Background"立即变成蓝色然后动画变成紫色,完全跳过动画变成黄色,然后变蓝。

我做错了什么?

  @IBAction func Press(sender: AnyObject) {

UIView.animateWithDuration(5, animations: {
self.Background.backgroundColor = UIColor.yellowColor()
self.Background.backgroundColor = UIColor.blueColor()
self.Background.backgroundColor = UIColor.purpleColor()
}, completion:{(Bool)  in
println("COLOR CHANGED")
})
}

对,因为那是全部 一个 更改为 一个 属性。您需要制作此 三个连续的不同 动画。首先动画到黄色;结束后,现在制作一个全新的蓝色动画;然后制作一个全新的紫色动画。

链接它们的最简单方法是将每个新动画放在前一个动画的完成处理程序中。像这样(你需要改变一些其他的东西,因为我拒绝编写函数和变量以大写字母开头的代码):

@IBAction func press(sender: AnyObject) {
    UIView.animateWithDuration(5.0/3.0, animations: {
        self.background.backgroundColor = UIColor.yellowColor()
        }, completion:{(Bool)  in
            UIView.animateWithDuration(5.0/3.0, animations: {
                self.background.backgroundColor = UIColor.blueColor()
                }, completion:{(Bool)  in
                    UIView.animateWithDuration(5.0/3.0, animations: {
                        self.background.backgroundColor = UIColor.purpleColor()
                        }, completion:{(Bool)  in
                            println("COLOR CHANGED")
                    })
            })
    })
}

在iOS8上还有一种更优雅(但更难)的方法,那就是使用关键帧动画。但要开始,我建议您先从简单的方法开始!

您不能在单个 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);