如何停止/取消UIProgressView进度动画?

时间:2016-09-26 14:34:05

标签: ios swift uiprogressview animatewithduration

我有一个UIProgressView,必须在用户按住按钮时进行更新。为了获得流畅的动画,我选择使用 UIView.animateWithDuration 而不是Timer来更新进度。

我期望达到的目标是:当用户按住按钮时,进度会增加,在30秒内达到100%(然后停止)。如果用户在时间结束前释放按钮,则进度条将在当前进度中停止。如果用户再次按住该按钮,则进度将重置为零,同一过程将重新亮起。

问题是用户松开按钮后无法取消动画。我尝试使用 progressView.layer.removeAllAnimation(),但也没有用。

贝娄是我的代码:

@IBAction func holdValueChanged(_ sender: CustomButton) {        
    if sender.isPressed {
        progressView.progress = 1.0

        UIView.animate(withDuration: 30.0, delay: 0.0, options: UIViewAnimationOptions.curveLinear, animations: { 
            self.progressView.layoutIfNeeded()
            }, completion: { (finished) in
                print("Ended progress animation")
        })
    }
    else {
        // stop progress animation
        progressView.layer.removeAllAnimations()
    }
}

2 个答案:

答案 0 :(得分:0)

尝试创建从当前状态到所需停止点的第二个(短)动画,例如,像这样(未经测试):

UIView.animate(withDuration: 0.1, delay: 0,
               options: [ .beginFromCurrentState, .allowUserInteraction ],
               animations: {
    self.progressView.progress = 1.0; // or whatever state it stopped at
}, completion:nil);

启动一个新动画应该取消任何现有动画,.beginFromCurrentState将阻止它跳到最后(如果你想在某个其他点结束)。作为奖励,短动画的视觉效果也可能比取消更好。

答案 1 :(得分:0)

实际上,这是因为不能保证要动画化的图层是progressView.layer。这就是为什么progressView.layer.removeAllAnimations()无法工作的原因。尝试这种方法:

for (CALayer *layer in self.progressBar.layer.sublayers) {
    [layer removeAllAnimations];
}