我有一个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()
}
}
答案 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];
}