我有一个带有3个UIViews的viewcontroller,它们相互堆叠。堆叠我的意思是在一个视图的底部,下一个视图开始。我在每个视图之间放置了垂直约束,常量= 0.当应用程序开始时,在viewDidLoad
中,我在两个顶视图之间的垂直约束中添加500,因此底部的两个视图被下推到做:
billViewBottomConstraint.constant = 500
然后,我调用以下函数为两个底部视图设置动画,然后向上移动,在顶视图的正下方结束:
func animate()
{
self.billViewBottomConstraint.constant = 0
UIView.animate(withDuration: 2.0) {
self.view.layoutIfNeeded()
}
}
这些观点肯定会对正确的位置产生影响,但不是我想要的方式。它看起来像在视图动画之前,它们向外扩展,当动画被调用时,它们向上和向内收缩到正确的位置。
答案 0 :(得分:0)
在viewDidLoad
内,布局尚未准备好进行动画处理。您应该至少等待viewDidLayoutSubviews
才能正确设置约束动画。检查一个布尔值,确保它只是第一次运行。
fileprivate var firstLayoutSubviewsTime = true
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if firstLayoutSubviewsTime {
firstLayoutSubviewsTime = false
animate()
}
}
您应该在动画块之前调用view.layoutIfNeeded()
,以确保正确加载所有视图。
你还应该修改动画块中的常量 ,而不是它。
func animate() {
self.view.layoutIfNeeded()
UIView.animate(withDuration: 2.0) {
self.billViewBottomConstraint.constant = 0
self.view.layoutIfNeeded()
}
}