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() 
    } 
} 
+0

试过你的解决方案,但没有动画发生 - 所有的意见立即出现在他们的最终位置。如果我在不调用动画块的情况下执行'billViewBottomConstraint.constant = 500',然后调用'self.view.layoutIfNeeded()',则视图将显示在正确的位置,向下移动500.不知道动画块中发生了什么,这个。 – Brosef

+0

检查我更新的答案。 – the4kman