动画没有停止使用 UIView.animate

Posted

技术标签:

【中文标题】动画没有停止使用 UIView.animate【英文标题】:Animation not stoping using UIView.animate 【发布时间】:2019-07-21 21:31:28 【问题描述】:

我的代码使用了一个简单的循环动画,该动画在 5 秒后不会停止。我想要做的就是有一个停止动画的第二个按钮。正如您在我的代码中看到的那样,circle.stopAnimating() 无效。

class VET: UIViewController 
    @IBOutlet weak var circle: UIImageView!
    var duration = 5

    @IBAction func start(_ sender: Any) 
        UIView.animate(withDuration: TimeInterval(duration), delay: 0.5, options: [.repeat, .autoreverse, .curveEaseIn, .curveEaseOut], animations:  () -> Void in
            let scale = CGAffineTransform(scaleX: 0.25, y: 0.25)
            self.circle.transform = scale
            print("animation")
        , completion:  _ in
            //if finished  or (finished: Bool)
            // if isAnimating 
            if self.circle.isAnimating 
                self.circle.stopAnimating()
                print("is animating -- stop animating")
             else 
                self.circle.startAnimating()
                print("start animating")
            
        )
    

    @IBAction func stop() 
        circle.stopAnimating()
    

【问题讨论】:

1. UIImage start/stopAnimating()UIView.animate 无关。如果您设置图像视图的animationImages 属性,它们正在使用。 2. UIView.animate 完成块在动画完成之前不会被调用(在这种情况下是 5.5 秒后)。 即使经过 5.5 秒也没有任何反应。 这个动画无限循环。 再次阅读我的第一点。 了解如何设置图像视图属性。如果我只想将动画设置为运行 10 秒并停止我将在属性中写入的内容。 【参考方案1】:

startAnimating 和 stopAnimating 用于在 GIF 等间隔内更改 imageview 的图像。在这里,您使用了带有重复的动画块,并且仅在动画中断时才会调用完成块。例如,当应用程序进入后台并再次返回前台时,它会被调用。

要在某个时间间隔后停止动画,您必须在该时间间隔后强制调用 removeAllAnimations。请参考以下代码:

@IBOutlet weak var circle: UIImageView!
var duration = 10

func start() 
    UIView.animate(withDuration: TimeInterval(duration), delay: 0.5, options: [.repeat, .autoreverse, .curveEaseIn, .curveEaseOut], animations:  () -> Void in
        let scale = CGAffineTransform(scaleX: 0.25, y: 0.25)
        self.circle.transform = scale
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(self.duration * 1000)) 
            // Code
            self.circle.layer.removeAllAnimations()
        

        print("animation")
    , completion:  _ in

        let scale = CGAffineTransform(scaleX: 1.0, y: 1.0)
        self.circle.transform = scale
    )

【讨论】:

【参考方案2】:

如果您需要对动画进行更多控制,那么您使用动画的方法是错误的。

改为使用 UIViewPropertyAnimator

备用属性 animator 初始化程序会返回一个需要启动的 animator 对象:

let animator = UIViewPropertyAnimator(duration: duration, curve: .linear) 
    self.redSquare.backgroundColor = .green

animator.startAnimation()

同样你可以用来停止与动画师相关的动画

animator.stopAnimation()

【讨论】:

以上是关于动画没有停止使用 UIView.animate的主要内容,如果未能解决你的问题,请参考以下文章

停止动作脚本动画

如何停止CSS3的动画

如何在路径上的特定位置停止 CSS 动画。没有时间

Push Segue 动画停止工作 [关闭]

如何在标题更改时停止不需要的 UIButton 动画?

如何停止默认动画?