Swift 进度视图动画使进度条超过 100%
Swift Progress View animation makes the bar go further than 100%
当为 ProgressView 使用动画时,如果我让动画 运行 退出,它会完全正常工作,但如果我在动画仍在运行时再次尝试 运行 这段代码,它将添加100% 到当前柱并使其穿过柱。图片应该更符合逻辑地解释情况。
进度从 1.0 (100%) 开始:
进度进行到一半:
代码再次 运行,导致进度超过 100%,尽管它使用了正确的时间来完成。
这是使用的代码:
self.progressView.setProgress(1.0, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
UIView.animate(withDuration: 10, delay: 0, options: [.beginFromCurrentState, .allowUserInteraction], animations: { [unowned self] in
self.progressView.setProgress(0, animated: true)
})
}
提前致谢!
setProgress(_:animated:)
方法已经为您处理了动画。当animated
参数设置为true
时,进度变化会动画化
尝试不使用动画块:
self.progressView.setProgress(1.0, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.progressView.setProgress(0.0, animated: true)
}
还要确保这不是自动布局问题。检查您对进度视图的限制并确保其宽度受到适当限制。
一些快速研究...
原来 UIProgressView
需要一点特别的努力才能停止当前的动画。看看这是否适合您:
// stop any current animation
self.progressView.layer.sublayers?.forEach { [=10=].removeAllAnimations() }
// reset progressView to 100%
self.progressView.setProgress(1.0, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// set progressView to 0%, with animated set to false
self.progressView.setProgress(0.0, animated: false)
// 10-second animation changing from 100% to 0%
UIView.animate(withDuration: 10, delay: 0, options: [], animations: { [unowned self] in
self.progressView.layoutIfNeeded()
})
}
当为 ProgressView 使用动画时,如果我让动画 运行 退出,它会完全正常工作,但如果我在动画仍在运行时再次尝试 运行 这段代码,它将添加100% 到当前柱并使其穿过柱。图片应该更符合逻辑地解释情况。
进度从 1.0 (100%) 开始:
进度进行到一半:
代码再次 运行,导致进度超过 100%,尽管它使用了正确的时间来完成。
这是使用的代码:
self.progressView.setProgress(1.0, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
UIView.animate(withDuration: 10, delay: 0, options: [.beginFromCurrentState, .allowUserInteraction], animations: { [unowned self] in
self.progressView.setProgress(0, animated: true)
})
}
提前致谢!
setProgress(_:animated:)
方法已经为您处理了动画。当animated
参数设置为true
时,进度变化会动画化
尝试不使用动画块:
self.progressView.setProgress(1.0, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.progressView.setProgress(0.0, animated: true)
}
还要确保这不是自动布局问题。检查您对进度视图的限制并确保其宽度受到适当限制。
一些快速研究...
原来 UIProgressView
需要一点特别的努力才能停止当前的动画。看看这是否适合您:
// stop any current animation
self.progressView.layer.sublayers?.forEach { [=10=].removeAllAnimations() }
// reset progressView to 100%
self.progressView.setProgress(1.0, animated: false)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// set progressView to 0%, with animated set to false
self.progressView.setProgress(0.0, animated: false)
// 10-second animation changing from 100% to 0%
UIView.animate(withDuration: 10, delay: 0, options: [], animations: { [unowned self] in
self.progressView.layoutIfNeeded()
})
}