UIViewPropertyAnimator 重复

UIViewPropertyAnimator repeat

我查看了以下 Whosebug 问题的答案,但 none 似乎对我有用:在执行完成块时,程序没有再次执行动画,而是喷出"complete" 无穷无尽,根本没有动画视图。

How can I repeat animation (using UIViewPropertyAnimator) certain number of times?

这是我的 AnimatorFactory class:

class AnimatorFactory {

    @discardableResult
    static func rotateRepeat(view: UIView) -> UIViewPropertyAnimator {
        let rotate = UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1.0, delay: 0.0, options: [.curveLinear], animations: {
            view.transform = CGAffineTransform(rotationAngle: .pi)
        }, completion: { _ in
            print("complete")
            self.rotateRepeat(view: view)
        })

        return rotate
    }

}

正如您所期望的那样调用 AnimatorFactory.rotateRepeat(view: <someView>)

但是,出现了上面提到的问题。我期望的是视图会反复旋转,直到我决定更改或停止它的某个时间;这正是我选择使用 UIViewPropertyAnimator 而不是 UIView.animate(withDuration:animations).

的原因

那么创建交互式、可重复的 UIView 动画的最佳方法是什么?非常感谢。

您的代码运行良好。问题是你的动画在第一次之后什么都不做。你说:

view.transform = CGAffineTransform(rotationAngle: .pi)

第一次,我们将旋转从 0 更改为 pi。那就是变化,所以才有了动画。但在那之后,我们只是一遍又一遍地说“留在圆周率”。我们在 pi,你说要留在那里,所以没有改变动画。

你想让每个动画做的是add pi,而不是be pi。

正如@matt 所建议的,我只是一遍又一遍地将视图的旋转设置为 .pi。因此,在完成块中,我现在将转换设置为 .identity,然后再次启动动画。

class AnimatorFactory {

    @discardableResult
    static func rotateRepeat(view: UIView) -> UIViewPropertyAnimator {
        let rotate = UIViewPropertyAnimator(duration: 1.0, curve: .linear)
        rotate.addAnimations {
            view.transform = CGAffineTransform(rotationAngle: .pi)
        }
        rotate.addCompletion{ _ in
            view.transform = .identity
            self.rotateRepeat(view: view)
        }
        rotate.startAnimation()

        return rotate
    }

}