如何在触发新动画时取消上一个动画?

Han*_*nXu 18 ios swift

我正在写一个相机应用程序,当用户点击屏幕时显示焦点方块有问题.

我的代码是(快速):

self.focusView.center = sender.locationInView(self.cameraWrapper)
self.focusView.transform = CGAffineTransformMakeScale(2, 2)
self.focusView.hidden = false

UIView.animateWithDuration(0.5, animations: { [unowned self] () -> Void in
    self.focusView.transform = CGAffineTransformIdentity
}, completion: { (finished) -> Void in
    UIView.animateWithDuration(0.5, delay: 1.0, options: nil, animations: { () -> Void in
        self.focusView.alpha = 0.0
    }, completion: { (finished) -> Void in
            self.focusView.hidden = true
            self.focusView.alpha = 1.0
    })
})
Run Code Online (Sandbox Code Playgroud)

但是,如果在前一个动画没有完成时连续点击屏幕,则新旧动画会混淆,焦点视图会表现得很奇怪,例如它会很快消失.

谁能告诉我如何取消以前的动画,特别是之前的完成块?

Jag*_*een 36

您可以使用user方法removeAllAnimations停止动画
使用下面的代码替换您的代码

self.focusView.center = sender.locationInView(self.cameraWrapper)
self.focusView.transform = CGAffineTransformMakeScale(2, 2)
self.focusView.hidden = false
self.focusView.layer.removeAllAnimations() // <<====  Solution
UIView.animateWithDuration(0.5, animations: { [unowned self] () -> Void in
    self.focusView.transform = CGAffineTransformIdentity
}, completion: { (finished) -> Void in

    UIView.animateWithDuration(0.5, delay: 1.0, options: nil, animations: { () -> Void in
        self.focusView.alpha = 0.0
    }, completion: { (finished) -> Void in
            self.focusView.hidden = true
            self.focusView.alpha = 1.0
    })
})
Run Code Online (Sandbox Code Playgroud)


参考:链接
在此输入图像描述

  • 确保在完成块中检查`finished`.如果对正在进行的任何动画执行`removeAllAnimations()`,那将是错误的,在这种情况下,您可能希望跳过该完成块中的步骤. (6认同)