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
}
}
我查看了以下 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
}
}