UIProgressView анимация работает правильно только один раз - PullRequest
0 голосов
/ 28 декабря 2018

Я выполнил некоторый 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 голосов
/ 29 декабря 2018

Это помогает понять, как анимация работает на абстрактном слое.То, что значение VALUE прогресса изменилось, не означает, что траектория обводки столбца, представляющего его значение, обновлена, чтобы отразить его изменение на 0.

Это означает, что когда представление ищет анимацию, оно пойдетот его значения «старый путь обводки», все еще с предыдущим значением, до значения «новый путь обводки», обновленное значение.

Для того, чтобы каждый раз, когда процентное изменение изменялось, вы хотели показать анимацию от 0,Вы должны обновить макет представления, а не только базовое значение.

Вызов

self.progressView.layoutIfNeeded()

После установки базового значения прогресса обновится индикатор выполнения, чтобы отобразить правильноезначение в следующем цикле рисования и будет происходить до запуска анимации, так что анимация перейдет от 0 к новому значению.

Если вы не хотите использовать подход @ E.Coms и ждать, пока представление завершит анимациювернуться к 0, прежде чем анимировать к новому значению.Хотя это выглядит довольно круто, это может быть не тот эффект, который у вас есть.

0 голосов
/ 29 декабря 2018

Вот ответ: если вы хотите, чтобы 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)
    }
}
}
...