Swift Progress View 动画使进度条超过 100%

Posted

技术标签:

【中文标题】Swift Progress View 动画使进度条超过 100%【英文标题】:Swift Progress View animation makes the bar go further than 100% 【发布时间】:2017-06-06 18:52:18 【问题描述】:

当为 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)
  )

提前致谢!

【问题讨论】:

您正在运行的其余代码(在设置下一个问题时)是否有可能无意中更改了进度视图的框架或约束? 【参考方案1】:

一些快速研究...

原来UIProgressView 需要一些特殊的努力来停止当前的动画。看看这是否适合你:

    // stop any current animation
    self.progressView.layer.sublayers?.forEach  $0.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()
        )
    

【讨论】:

它适用于所有值,除了 0 - 它没有动画就消失了......【参考方案2】:

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)

还要确保这不是自动布局问题。检查您对进度视图的约束并确保其宽度得到适当的约束。

【讨论】:

以上是关于Swift Progress View 动画使进度条超过 100%的主要内容,如果未能解决你的问题,请参考以下文章

JS框架_(Progress.js)圆形动画进度条

动画css进度条而不在更新之间跳转?

如何在 Apple WatchKit 中为循环进度设置动画?

jQuery插件,用于绘制动画圆形进度条

Swift 3 Alamofire 请求进度

Animated progress view with CAGradientLayer(带翻译)