Как сделать анимацию с ограничениями в Swift? - PullRequest
1 голос
/ 16 июня 2019

Я запрограммировал гистограмму, когда каждый столбец имеет значение UIView с ограничениями по высоте и верхнему ограничению для суперпредставления.

После ввода значений высот анимация должна выполняться с 10длительность в секундах.

Однако анимация не происходит.

Сначала я вычисляю новую высоту бара:

let portion = Float(self.currentValue!) / Float(self.maxValue!) // portion of max height of the bar
let newTopConstraint = Float(maxTopConstraint) * portion // the new distance from the top of the superview

var heightDiff = newTopConstraint - Float(self.barTopConstraint.constant)
heightDiff = abs(heightDiff)

Теперь, когда я получил новую высоту длябар, я хочу оживить его до этой позиции:

UIView.animate(withDuration: 10) {
    self.barTopConstraint.constant = newTopConstraint
    self.heightCons.constant += heightDiff
    self.barView.setNeedsLayout()
}

К сожалению, анимация никогда не происходит.Что не так с моей анимацией?

1 Ответ

4 голосов
/ 16 июня 2019

Замените код анимации следующим:

barTopConstraint.constant = newTopConstraint
heightCons.constant += heightDiff

UIView.animate(withDuration: 10, animations: view.layoutIfNeeded)

Когда вы обновляете ограничения, просто установка константы на что-то другое не обновляет представление.

Чтобы обновить представление, вызовите layoutIfNeeded() в представлении, для которого вы хотите обновить ограничения.

В этом случае я звоню layoutIfNeeded() на главном экране, поэтому каждое подпредставление также будет обновлено.

В будущем, если вы хотите обновить ограничения без анимации, вызовите view.layoutIfNeeded() сразу после установки константы. Когда вы хотите анимацию, поместите layoutIfNeeded внутри UIView.animate.

...