我正在改变一些约束,并根据用户使用的设备隐藏某个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吗?
谢谢,
答案 0 :(得分:3)
layoutIfNeeded()
的目的是强制对视图及其子视图进行同步(基本上“立即”)重绘。在处理动画时,Apple认为最佳做法是在动画块之前调用layoutIfNeeded()
以确保挂起的布局操作已完全完成。这将为操作准备视图以确定和设置新布局。然后在动画块中第二次调用layoutIfNeeded()
,以确保完成对布局的动画更改。
Apple的viewDidLayoutSubviews()
文档表示调用此方法并不表示视图子视图的各个布局已经过调整。因此,当您开始检查正在使用的设备并相应地调整布局时,无法保证所有先前的布局操作都已成功完成。出于这个原因,最好继续拨打layoutIfNeeded()
两次。确保先前的任何布局操作都已完成,然后再次根据设备类型制定您所做的布局更改。
<强>来源:强>
How do I animate constraint changes?