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

问题描述 投票:0回答:2

我有必须在用户持有的按钮被更新的UIProgressView。对于一个流畅的动画我选择使用UIView.animateWithDuration,而不是一个定时器来更新进度。

我期望达到的目标是:当用户持有的按钮,在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()
    }
}
ios swift uiprogressview animatewithduration
2个回答
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会阻止它跳跃到年底(如果你想在其他一些点结束)。作为奖励,短动画的视觉效果也可能比仅仅抵消更好。


0
投票

其实这是因为没有保证该层,正被动画是progressView.layer。这就是为什么progressView.layer.removeAllAnimations()将无法工作。试试这个办法:

for (CALayer *layer in self.progressBar.layer.sublayers) {
    [layer removeAllAnimations];
}
© www.soinside.com 2019 - 2024. All rights reserved.