更改约束时`self.view.layoutIfNeeded()`做什么

时间:2015-03-19 17:27:58

标签: ios swift

所以我正在学习如何从屏幕外制作视图动画,以用作滑块菜单。

class ViewController: UIViewController {
    @IBOutlet weak var red: UIView!
    @IBOutlet weak var redHConstraint: NSLayoutConstraint!

    @IBAction func buttonShift(sender: AnyObject) {
        self.view.layoutIfNeeded()        // **HERE**
        UIView.animateWithDuration(0.5) {
            self.redHConstraint.constant = 0
            self.view.layoutIfNeeded()    // And **HERE**
        }
    }

}

我已经从How to animate a UIView with constraints in Swift?

改编了这段代码

1。 self.view.layoutIfNeeded()部分代码的作用是什么?

2。为什么在动画之前和期间编码2x?

注意:如果我评论出第一个self.view.layoutIfNeeded()没有任何变化,但如果我评论出第二个self.view.layoutIfNeeded(),则该动作不再是动画,只会出现在新坐标中。

1 个答案:

答案 0 :(得分:26)

基本上调用self.view.layoutIfNeeded()会强制self.view及其子视图的布局,如果setNeedsLayout的某些更改集self.view

setNeedsLayout用于设置一个标记,无论何时调用layoutIfNeeded(),都会调用layoutSubviews。它决定了呼叫的“如果需要”方面。

如果您对UIView进行了更改,导致其setNeedsLayout但未调用layoutIfNeeded()(因此未调用layoutSubviews),则不会更新,因此可能会导致动画出现问题。如果您事先调用它,它将确保如果有更改需要更新布局,那么它将在动画制作之前将其应用于您的视图及其所有子视图。

当然,动画制作动画时需要更新。