UIProgressView动画只能正常运行一次

时间:2018-12-28 19:28:40

标签: ios swift uikit uiprogressview

我正在执行一些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

2 个答案:

答案 0 :(得分:0)

这是答案:如果要将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)
    }
}
}

答案 1 :(得分:0)

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

这意味着当视图要进行动画处理时,它将从原来的“旧笔划路径”值变为更新后的值“新笔划路径”值。

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

通话

self.progressView.layoutIfNeeded()

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

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

相关问题