我应该在viewDidLayoutSubviews()中调用layoutIfNeeded吗?

时间:2016-06-20 19:07:13

标签: ios xcode swift layout constraints

我正在改变一些约束,并根据用户使用的设备隐藏某个VC上的某些元素。

像这样:

   override func viewDidLayoutSubviews() {
        if Iphone6 == true {
            self.view.layoutIfNeeded()
            self.someConst.constant = 70
            self.anotherConst.constant = 67
            self.someButton.hidden = true
            self.someView.hidden = true
            self.view.layoutIfNeeded()
        }   
   }

现在我想知道是否需要在layoutIfNeeded()中拨打viewDidLayoutSubviews两次?

我知道如果在更改约束时使用animateWithDuration,则必须调用layoutIfNeeded()两次,但这也适用于viewDidLayoutSubviews吗?

谢谢,

1 个答案:

答案 0 :(得分:3)

layoutIfNeeded()的目的是强制对视图及其子视图进行同步(基本上“立即”)重绘。在处理动画时,Apple认为最佳做法是在动画块之前调用layoutIfNeeded()以确保挂起的布局操作已完全完成。这将为操作准备视图以确定和设置新布局。然后在动画块中第二次调用layoutIfNeeded(),以确保完成对布局的动画更改。

Apple的viewDidLayoutSubviews()文档表示调用此方法并不表示视图子视图的各个布局已经过调整。因此,当您开始检查正在使用的设备并相应地调整布局时,无法保证所有先前的布局操作都已成功完成。出于这个原因,最好继续拨打layoutIfNeeded()两次。确保先前的任何布局操作都已完成,然后再次根据设备类型制定您所做的布局更改。

<强>来源:

How do I animate constraint changes?

setNeedsLayout vs layoutIfNeeded Explained

viewDidLayoutSubviews Reference