我有必须在用户持有的按钮被更新的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()
}
}
尝试创建从当前状态的第二(短)的动画所需的停止点,例如,是这样的(另):
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
会阻止它跳跃到年底(如果你想在其他一些点结束)。作为奖励,短动画的视觉效果也可能比仅仅抵消更好。
其实这是因为没有保证该层,正被动画是progressView.layer。这就是为什么progressView.layer.removeAllAnimations()将无法工作。试试这个办法:
for (CALayer *layer in self.progressBar.layer.sublayers) {
[layer removeAllAnimations];
}