layoutIfNeeded如何使用?

何时以及如何使用layoutIfNeeded ? 我知道当我们改变一个视图的布局时,我们可以调用setNeedsLayout来更新布局,但不知道什么时候应该使用layoutIfNeeded

注意:我在实际代码中使用了layoutIfNeeded ,但忘记了在什么情况下使用它。

layoutIfNeeded强制接收器根据需要立即布局其子视图。

假设你已经重写了layoutSubviews ,并且UIKit认为你的视图需要布局,无论什么原因(比如你在处理某些用户操作时调用了setNeedsLayout )。 然后,将立即调用您的自定义layoutSubviews方法,而不是在常规的UIKit运行循环事件序列中(在事件处理之后,但在drawRect:之前)调用该方法。

一个为什么你可能需要在一个运行循环中调用layoutIfNeeded的例子:

  1. 使用自定义布局调整包含表格视图的自定义视图的大小。 setNeedsLayout被设置,以便layoutSubviews稍后被调用。
  2. 控制器对象在处理用户事件时要求表视图滚动到某个特定的单元格。
  3. 您的自定义视图会执行layoutSubviews中的表视图的一些自定义大小,以更改表视图大小。

问题是当控制器要求滚动表格视图(步骤2)时,表格视图的边界是陈旧的。 更新后的边界只能在后面的表格视图上设置(步骤3)。 在layoutSubviews完成之后,控制器希望表格视图滚动到的位置可能实际上不可见。 一个解决scheme就是在控制器知道可能发生的情况下调用layoutIfNeeded

setNeedsLayout实际上调用了layoutIfNeeded,所以如果你的调用setNeedsDisplay没有理由调用layoutIfNeeded。 以这种方式,setNeedsLayout是调用layoutIfNeeded的一个简便方法,它可以完成繁重的工作。