layoutIfNeeded如何使用?
何时以及如何使用layoutIfNeeded
? 我知道当我们改变一个视图的布局时,我们可以调用setNeedsLayout
来更新布局,但不知道什么时候应该使用layoutIfNeeded
。
注意:我在实际代码中使用了layoutIfNeeded
,但忘记了在什么情况下使用它。
layoutIfNeeded
强制接收器根据需要立即布局其子视图。
假设你已经重写了layoutSubviews
,并且UIKit认为你的视图需要布局,无论什么原因(比如你在处理某些用户操作时调用了setNeedsLayout
)。 然后,将立即调用您的自定义layoutSubviews
方法,而不是在常规的UIKit运行循环事件序列中(在事件处理之后,但在drawRect:
之前)调用该方法。
一个为什么你可能需要在一个运行循环中调用layoutIfNeeded
的例子:
- 使用自定义布局调整包含表格视图的自定义视图的大小。
setNeedsLayout
被设置,以便layoutSubviews
稍后被调用。 - 控制器对象在处理用户事件时要求表视图滚动到某个特定的单元格。
- 您的自定义视图会执行
layoutSubviews
中的表视图的一些自定义大小,以更改表视图大小。
问题是当控制器要求滚动表格视图(步骤2)时,表格视图的边界是陈旧的。 更新后的边界只能在后面的表格视图上设置(步骤3)。 在layoutSubviews
完成之后,控制器希望表格视图滚动到的位置可能实际上不可见。 一个解决scheme就是在控制器知道可能发生的情况下调用layoutIfNeeded
。
setNeedsLayout实际上调用了layoutIfNeeded,所以如果你的调用setNeedsDisplay没有理由调用layoutIfNeeded。 以这种方式,setNeedsLayout是调用layoutIfNeeded的一个简便方法,它可以完成繁重的工作。