UIViews在动画期间无法正确移动

时间:2017-08-10 19:51:23

标签: ios animation uiview

我有一个带有3个UIViews的viewcontroller,它们相互堆叠。堆叠我的意思是在一个视图的底部,下一个视图开始。我在每个视图之间放置了垂直约束,常量= 0.当应用程序开始时,在viewDidLoad中,我在两个顶视图之间的垂直约束中添加500,因此底部的两个视图被下推到做:

billViewBottomConstraint.constant = 500

然后,我调用以下函数为两个底部视图设置动画,然后向上移动,在顶视图的正下方结束:

func animate()
{

    self.billViewBottomConstraint.constant = 0

    UIView.animate(withDuration: 2.0) {
        self.view.layoutIfNeeded()
    }

}

这些观点肯定会对正确的位置产生影响,但不是我想要的方式。它看起来像在视图动画之前,它们向外扩展,当动画被调用时,它们向上和向内收缩到正确的位置。

1 个答案:

答案 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()
    }
}