我设置了一个动画,以在打开另一个开关/标签时隐藏它。同时,刚刚打开的开关向上移动。简单的解释here可以很好地工作。
但是,当我尝试在关闭开关后将其向下移动时,它不会退缩。另一个开关重新显示正常,但最高约束更改不会触发。
我相对较不熟悉这种类型的设置,并以编程方式为所有动画设置动画,花了一个小时后才感到困惑。是因为我要设置相对于另一个约束的最大约束?如果它第一次起作用,那有什么关系?即使隐藏开关的alpha设置为零,它的框架仍然存在,对吗?还是我在愚蠢地做一些简单的事情?
// Works Perfectly!
func hideVeg() {
self.view.layoutIfNeeded()
UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
self.vegetarianSwitch.alpha = 0
self.vegetarianLabel.alpha = 0
self.veganSwitch.topAnchor.constraint(equalTo: self.vegetarianSwitch.bottomAnchor, constant: -30).isActive = true
self.view.layoutIfNeeded()
})
}
// Showing the label and switch works, but the topAnchor constraint never changes!
func showVeg() {
self.view.layoutIfNeeded()
UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseIn], animations: {
self.vegetarianSwitch.alpha = 1
self.vegetarianLabel.alpha = 1
// This is the constraint that doesn't change.
// This is exactly what it was set to before the other hideVeg() runs.
self.veganSwitch.topAnchor.constraint(equalTo: self.vegetarianSwitch.bottomAnchor, constant: 40).isActive = true
self.view.layoutIfNeeded()
})
}
最佳答案
这里的问题是您不是在修改约束,而是实际上为每个动画创建新的约束。相反,您要做的只是创建一次约束(您可以在代码中或在Interface Builder中进行创建,然后拖动并退出)。然后,您可以只更改动画块中现有约束的.constant
字段。