使用UIViewPropertyAnimator多次重复和反转动画

时间:2018-03-21 23:25:30

标签: ios swift animation uiviewpropertyanimator

我试图让我的动画再次将屏幕从黑色变为白色再到黑色,并重复一定次数。目前使用代码,我将动画从黑色变为白色,然后跳回黑色。无论如何反向运行动画或添加在第一个动画完成后运行的动画?

override func viewDidAppear(_ animated: Bool) {
    let viewColorAnimator: UIViewPropertyAnimator = UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 4.0,
        delay: 0.0,
        options: [.curveEaseInOut],
        animations: {
            UIView.setAnimationRepeatCount(3);
            self.lightView.backgroundColor = .white
        })

    viewColorAnimator.startAnimation()
}

我尝试将此代码块添加到项目中,但结果是一样的:

viewColorAnimator.addCompletion {_ in
    let secondAnimator = UIViewPropertyAnimator(duration: 4.0, curve: .linear) {
        self.lightView.backgroundColor = .black
    }
    secondAnimator.startAnimation()
}
编辑:我发现这是因为setAnimationRepeatCount,因为最后一次迭代正常工作。如何在没有重复计数的情况下多次运行动画?

3 个答案:

答案 0 :(得分:0)

有一种简单的方法来运行动画。对于此方法:如果要在完成后重复动画,可以添加.autoreverse和.repeat选项。像这样:

UIView.animate(withDuration: TimeInterval(randomTime), delay: 0, options: [.repeat,.autoreverse], animations: {
    //Animation code here
}, completion: {(bool)
   //Do something after completion
})

您可以在动画完成后将想要执行的代码放入。

并且,您可以使用计时器作为运行动画特定时间的方式。

答案 1 :(得分:0)

Xcode 9.4.1(Swift 4.1.2) Xcode 10 beta 3(Swift 4.2)

这是使用 UIViewPropertyAnimator 的方法-基本上,我们只需在选项中添加 .repeat .autoreverse 。您到达那里的路途已达到99%:

override func viewDidAppear(_ animated: Bool) {
    let viewColorAnimator: UIViewPropertyAnimator = UIViewPropertyAnimator.runningPropertyAnimator(
        withDuration: 4.0,
        delay: 0.0,
        options: [.curveEaseInOut, .repeat, .autoreverse],
        animations: {
            UIView.setAnimationRepeatCount(3)
              self.lightView.backgroundColor = .white
        })

        viewColorAnimator.startAnimation()
    }

答案 2 :(得分:0)

文档说与方向有关的选项被忽略。您可以检查所附的here图片。

要实现反向动画:

创建一个动画师属性。

private var animator: UIViewPropertyAnimator = {

    let propertyAnimator = UIViewPropertyAnimator.runningPropertyAnimator(
    withDuration: 4.0,
    delay: 0.0,
    options: [.curveEaseInOut, .autoreverse],
    animations: {
        UIView.setAnimationRepeatCount(3)
        UIView.setAnimationRepeatAutoreverses(true)
        self.lightView.backgroundColor = .white
    })

    return propertyAnimator
}()

P.S。我们需要在选项中提及.autoreverse。否则,UIView.setAnimationRepeatAutoreverses(true)将无法工作。