UIProgressView 动画只能正常工作一次

Posted

技术标签:

【中文标题】UIProgressView 动画只能正常工作一次【英文标题】:UIProgressView animation works correctly only once 【发布时间】:2018-12-28 19:28:39 【问题描述】:

我做一些 HTTP 请求,在收到 HTTP 响应时设置一个类属性,并使用willSet 更新进度条值。进度条动画只工作一次。

var data: CompatibilityData? 
    didSet 
        self.progressView.setProgress(0.0, animated: false)

        UIView.animate(withDuration: 2.0) 
            self.progressView.setProgress(data.percentage! / 100, animated: true)
        
    


...

let task = URLSession.shared.dataTask(with: url)  data, response, error in
    ...

    if let data = data 
        ...

        DispatchQueue.main.async 
            if let r = response 
                self.data = r
            
        
     


task.resume()

当我第二次收到 HTTP 响应时,预期的行为会将进度重置为 0,并再次将其从 0 设置为 data.percentage。目前它从旧的data.percentage 移动到新的data.percentage

【问题讨论】:

var data: CompatibilityData? 更改为var compData: CompatibilityData? 之类的名称,您就有了3 个同名的不同对象。 【参考方案1】:

它有助于理解动画在抽象层的工作方式。仅仅因为进度 VALUE 发生了变化,并不意味着代表它的值的条的笔划路径已经更新以反映它的更改为 0。

这意味着当视图想要动画时,它会从它的“旧笔触路径”值(仍为先前值)变为“新笔触路径”值,即更新后的值。

为了每次从 0 开始显示动画的百分比变化,您必须更新视图的布局,而不仅仅是基础值。

打电话

self.progressView.layoutIfNeeded()

设置基础进度值后,progressView Bar 将更新以反映下一个绘图周期的正确值,并将在动画开始之前发生,以便动画从 0 变为新值。

除非您想采用@E.Coms 方法并等待视图完成动画回到 0,然后再动画到新值。尽管这看起来很酷,但可能不是您想要的效果。

【讨论】:

【参考方案2】:

答案是:如果你想让 progressView 为 0.0,就让它动起来吧。

var data: CompatibilityData? 
didSet 
    self.progressView.setProgress(0.0, animated:**true**)

    UIView.animate(withDuration: 2.0) 
        self.progressView.setProgress(data.percentage! / 100, animated: true)
    


【讨论】:

这不会导致两个动画同步进行吗?或者setProgress:animated 是否允许在新的UIView 动画发生之前完全完成?我的建议是正在布置进度,但视图未绘制到 0。看起来可能调用 self.progressView.layoutIfNeeded() 应该在动画开始前一帧将进度条重绘为 0。他不一定希望进度条在下一个动画开始之前动画回 0

以上是关于UIProgressView 动画只能正常工作一次的主要内容,如果未能解决你的问题,请参考以下文章

jQuery不透明度/淡入淡出动画只能使用一次

UIProgressView setProgress 动画搞砸了

低于 0.1 的 UIProgressView 值未正确显示

UIProgressView 在 setProgress 期间变为透明,动画 = true

动画在 Android 中无法正常工作(仅执行一次)

UITableViewCell 上的 UIProgressView