UIViews在动画过程中不能正确移动
问题描述:
我有一个viewcontroller和3个UIViews堆叠在一起。通过堆叠我的意思是在一个视图的底部,下一个视图开始。我已经在constant = 0的每个视图之间放置了垂直约束。当应用程序开始时,在viewDidLoad
中,我将两个顶部视图之间的垂直约束添加到500,所以底部的两个视图通过下面的方式被推下:UIViews在动画过程中不能正确移动
billViewBottomConstraint.constant = 500
我然后调用下面的函数进行动画处理的两个底部的观点搬回来了,就在顶视图下方结束:
func animate()
{
self.billViewBottomConstraint.constant = 0
UIView.animate(withDuration: 2.0) {
self.view.layoutIfNeeded()
}
}
的意见肯定动画到合适的位置,但没有办法,我想。它看起来像动画之前的视图,它们向外扩展,当动画被称为时,它们收缩并向内朝向正确的位置。
答
里面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()
}
}
试过你的解决方案,但没有动画发生 - 所有的意见立即出现在他们的最终位置。如果我在不调用动画块的情况下执行'billViewBottomConstraint.constant = 500',然后调用'self.view.layoutIfNeeded()',则视图将显示在正确的位置,向下移动500.不知道动画块中发生了什么,这个。 – Brosef
检查我更新的答案。 – the4kman