如何快速制作带有约束的动画?

时间:2019-06-16 07:39:02

标签: ios swift animation

我已经编程了一个条形图,每个条形为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 个答案:

答案 0 :(得分:4)

为此替换动画代码:

barTopConstraint.constant = newTopConstraint
heightCons.constant += heightDiff

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

更新约束时,仅将常数设置为其他值不会更新视图。

要更新视图,请在要为其更新约束的视图上调用layoutIfNeeded()

在这种情况下,我在主视图上调用layoutIfNeeded(),因此每个子视图也会被更新。

将来,如果您要更新约束而没有动画,请在设置常量后立即调用view.layoutIfNeeded()。要制作动画时,请将layoutIfNeeded放在UIView.animate内。