layoutIfNeeded
何时以及如何使用?我知道当我们更改视图的布局时,我们可以调用setNeedsLayout
来更新布局,但不确定何时应该使用layoutIfNeeded
。
注意:我在实际代码中使用了layoutIfNeeded
,但忘记了它的使用环境。
答案 0 :(得分:63)
layoutIfNeeded
强制接收者在需要时立即布置其子视图。
假设您已覆盖layoutSubviews
,并且UIKit认为您的视图因任何原因需要布局(例如,在处理某些用户操作时您调用了setNeedsLayout
)。然后,将立即调用您的自定义layoutSubviews
方法,而不是通常在常规UIKit运行循环事件序列中调用它(在事件处理之后但在drawRect:
之前)。
您可能需要在单个运行循环中调用layoutIfNeeded
的原因示例:
setNeedsLayout
以便稍后调用layoutSubviews
。layoutSubviews
中对表视图执行一些自定义大小调整,以更改表视图大小。问题是当控制器要求表视图滚动时(步骤2),表视图已经过时了。更新的边界仅在稍后的表视图中设置(步骤3)。在layoutSubviews
完成后,控制器希望滚动到的表视图可能实际上不可见。然后解决方案是让控制器在知道可能发生这种情况的情况下调用layoutIfNeeded
。
答案 1 :(得分:0)
现在可以通过参考更新周期来描述这两种方法之间的区别。
UIView的setNeedsLayout方法告诉系统要在更新周期到来时布局并重绘该视图及其所有子视图。这是一个异步活动,因为该方法会立即完成并返回,但是直到稍后一段时间才实际进行布局和重绘,并且您不知道该更新周期何时。
相比之下,layoutIfNeeded方法是一个同步调用,它告诉系统您希望对视图及其子视图进行布局和重绘,并且您希望它立即完成而无需等待更新周期。对该方法的调用完成后,已经根据该方法调用之前记录的所有更改对布局进行了调整和绘制。
因此,简洁地说,layoutIfNeeded说请立即更新,而setNeedsLayout说请更新,但是您可以等到下一个更新周期。
答案 2 :(得分:0)
LayoutSubViews()-不要直接调用,而是调用 setNeedsLayout(),如果约束基础未提供预期值,则覆盖 行为。
SetNeedsLayout()-调用主线程,它等待下一个绘制周期。 对性能有好处。
LayoutIfNeeded()-立即布局子视图。
答案 3 :(得分:-11)
setNeedsLayout实际上调用了layoutIfNeeded,所以如果调用setNeedsDisplay,则没有理由调用layoutIfNeeded。通过这种方式,setNeedsLayout是一个方便的方法,用于调用layoutIfNeeded来完成繁重的工作。