layoutSubviews和layoutIfNeeded

最近项目中有一个bug, 自动布局然后在子view中后续更新高度约束的时候, 子试图的高度不正确,相当于没有更新, 于是想到了代码更新约束,重新布局。
这里就涉及到了三个布局的方法

1,setNeedsLayout
使接收者的当前布局无效,并在下一次更新周期中触发布局更新。当您想要调整视图的子视图的布局时,请在应用程序的主线程上调用此方法。该方法会立即记录请求并返回。因为该方法不会强制立即更新,而是等待下一个更新周期,您可以在这些视图更新之前使用它来使多个视图的布局无效。这种行为允许您将所有布局更新合并到一个更新周期,这通常对性能更好。
2, layoutIfNeeded
如果有需要更新的布局,则立即执行,改方法可以立即强制更新约束,尤其是自动布局的时候,如果没有需要更新的布局,则不执行任何方法,立即返回。该方法作用于当前view及其子view中。
3,layoutSubViews
该方法的默认实现在ios5.1和之前没有任何作用。ios5.1以后的默认实现将使用您设置的任何约束来确定任何子视图的大小和位置。子类可以根据需要重写此方法以执行更精确的子视图布局。只有当子视图的自定义和约束行为不能提供您想要的行为时,您才应该重写此方法。直接设置子视图的位置和大小。
原则上不应该直接调用该方法, 如果需要更新布局的话可以调用setNeedsLayout标记为待布局,这样下一个周期的时候会更新布局,如果想立即更新布局的话 就要调用layoutIfNeeded强制更新布局。

你可能感兴趣的:(layoutSubviews和layoutIfNeeded)