首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIViewPropertyAnimator停止重复

UIViewPropertyAnimator停止重复
EN

Stack Overflow用户
提问于 2020-01-17 20:47:15
回答 1查看 246关注 0票数 2

我在一个工厂类中使用了以下代码来返回UIViewPropertyAnimators,以便在何时何地使用:

代码语言:javascript
复制
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)时,动画不会停止。它的名称如下:

代码语言:javascript
复制
    print("\(spindleAnimator.description)")
    spindleAnimator.stopAnimation(true)
    print("\(spindleAnimator.description)")

以上代码由用户点击动画视图触发,并输出如下:

代码语言:javascript
复制
<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:)来测试这个理论:

代码语言:javascript
复制
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
    }

它给了

代码语言:javascript
复制
(<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
...

证实了我的怀疑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-20 13:20:02

您无法停止动画,因为您持有由您的函数创建和返回的UIViewPropertyAnimator的第一个对象,但是您的函数的这一行每次创建UIViewPropertyAnimator的新对象时都会创建。

代码语言:javascript
复制
self.spinSpindle(spindle: spindle)

并且您不能将此对象保存/返回到任何位置。您总是将stopAnimation函数调用到从函数返回的第一个对象。这就是为什么在主轴完成第一次革命之前,你可以停止动画,而不是在完成块调用之后。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59794654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档