我在一个工厂类中使用了以下代码来返回UIViewPropertyAnimators,以便在何时何地使用:
class AnimatorFactory {
@discardableResult
static func spinSpindle(spindle: UIView) -> UIViewPropertyAnimator {
let spinSpindleAnimator = UIViewPropertyAnimator(duration: 1.0, curve: .linear)
spinSpindleAnimator.addAnimations {
spindle.transform = CGAffineTransform(rotationAngle: .pi)
}
spinSpindleAnimator.addCompletion{ position in
print("spinSpindle.complete: \(position.rawValue)")
spindle.transform = .identity
self.spinSpindle(spindle: spindle)
}
spinSpindleAnimator.startAnimation()
return spinSpindleAnimator
}
...代码创建了一个UIViewPropertyAnimator,它允许一个永久的动画视图(一个不断旋转和旋转的视图)。它通过在完成块中再次调用自己来实现这一点。我现在的问题是我无法停止使用UIViewPropertyAnimator.stopAnimation(true)的动画。
true in stopAnimation(_ withoutFinishing:)值是为了确保动画返回到UIViewAnimatingState.inactive状态,而不必使用finishAnimation(at finalPosition:)执行任何清理。
当我调用stopAnimation(true)时,动画不会停止。它的名称如下:
print("\(spindleAnimator.description)")
spindleAnimator.stopAnimation(true)
print("\(spindleAnimator.description)")以上代码由用户点击动画视图触发,并输出如下:
<UIViewPropertyAnimator(0x600001c1c100) [inactive] interruptible>
<UIViewPropertyAnimator(0x600001c1c900) [inactive] interruptible>对我来说,这表明spindleAnimator指的是由于AnimatorFactory.spinSpindle(spindle:)静态方法中的“递归”调用而产生的不同的AnimatorFactory.spinSpindle(spindle:)。我可能弄错了。
本质上,我寻求帮助,以创建一个真正的互动和重复的动画。到目前为止,我一直有难以置信的麻烦,但我不会抱怨,因为我已经学到了很多。但是,我需要一些帮助,通过找到一个工作的stopAnimation(withoutFinishing:)调用将所有这些都捆绑在一起。
谢谢!
编辑:
另一个有趣的事实是,如果我在主轴完成第一次革命之前(换句话说,在完成块执行之前)单击它,我就能够停止动画。这使我相信,对spinSpindle(spindle:)的“递归”调用会创建另一个没有句柄可调用stopAnimation(withoutFinishing:)的UIViewPropertyAnimator。不过,我想我看不出是怎么回事.
每次调用spinSpindleAnimator.description时,我都会通过打印spinSpindle(spindle:)来测试这个理论:
class AnimatorFactory {
@discardableResult
static func spinSpindle(spindle: UIView) -> UIViewPropertyAnimator {
let spinSpindleAnimator = UIViewPropertyAnimator(duration: 1.0, curve: .linear)
spinSpindleAnimator.addAnimations {
spindle.transform = CGAffineTransform(rotationAngle: .pi)
}
spinSpindleAnimator.addCompletion{ position in
print("(\(spinSpindleAnimator.description)) spinSpindle.complete: \(position.rawValue)")
spindle.transform = .identity
self.spinSpindle(spindle: spindle)
}
spinSpindleAnimator.startAnimation()
return spinSpindleAnimator
}它给了
(<UIViewPropertyAnimator(0x600001b20300) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b28b00) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b38600) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b31000) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b38300) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b38600) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b38700) [unknown] running interruptible>) spinSpindle.complete: 0
(<UIViewPropertyAnimator(0x600001b20600) [unknown] running interruptible>) spinSpindle.complete: 0
...证实了我的怀疑。
发布于 2020-01-20 13:20:02
您无法停止动画,因为您持有由您的函数创建和返回的UIViewPropertyAnimator的第一个对象,但是您的函数的这一行每次创建UIViewPropertyAnimator的新对象时都会创建。
self.spinSpindle(spindle: spindle)并且您不能将此对象保存/返回到任何位置。您总是将stopAnimation函数调用到从函数返回的第一个对象。这就是为什么在主轴完成第一次革命之前,你可以停止动画,而不是在完成块调用之后。
https://stackoverflow.com/questions/59794654
复制相似问题