我看过以下StackOverflow问题中的答案,但似乎没有一个适合我:在完成块的执行过程中,程序没有再次执行动画,而是无限地释放出“完全”而没有动画化视图。
How can I repeat animation (using UIViewPropertyAnimator) certain number of times?
这是我的AnimatorFactory课程:
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动画的最佳方法是什么?非常感谢。
发布于 2020-01-13 18:19:36
你的代码运行良好。问题是你的动画在第一次之后什么也不做。你说:
view.transform = CGAffineTransform(rotationAngle: .pi)第一次,我们改变旋转从0到π。这是一个变化,所以有动画。但在那之后,我们就一遍又一遍地说“呆在π上”。我们在π,你说呆在那里,所以动画没有变化。
您希望每个动画都添加pi,而不是pi。
发布于 2020-01-13 18:41:47
正如@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
}
}https://stackoverflow.com/questions/59721594
复制相似问题