setNeedsLayout、layoutIfNeeded、la
官网文档的阐述
setNeedsLayout
Call this method on your application’s main thread when you want to adjust the layout of a view’s subviews. This method makes a note of the request and returns immediately. Because this method does not force an immediate update, but instead waits for the next update cycle, you can use it to invalidate the layout of multiple views before any of those views are updated. This behavior allows you to consolidate all of your layout updates to one update cycle, which is usually better for performance.
当您想要调整视图的子视图的布局时,请在应用程序的主线程上调用此方法。此方法记录请求并立即返回。由于此方法不强制立即更新,而是等待下一个更新周期,所以您可以使用它在更新这些视图之前使多个视图的布局无效。这种行为允许您将所有布局更新合并到一个更新周期,这通常对性能更好。
Tips:下一次更新周期就是runloop的循环周期。
layoutIfNeeded
Use this method to force the view to update its layout immediately. When using Auto Layout, the layout engine updates the position of views as needed to satisfy changes in constraints. Using the view that receives the message as the root view, this method lays out the view subtree starting at the root. If no layout updates are pending, this method exits without modifying the layout or calling any layout-related callbacks.
使用此方法来强制视图立即更新其布局。在使用自动布局时,布局引擎回根据需要更新视图的位置,以满足约束的更改。此方法使用接收消息的视图作为根视图,列出从视图根开始的视图子树。如果没有布局等待更新,此方法将在不修改布局或调用任何与布局相关的回调的情况下退出。
layoutSubviews
The default implementation of this method does nothing on iOS 5.1 and earlier. Otherwise, the default implementation uses any constraints you have set to determine the size and position of any subviews.
Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
这个方法的默认实现在iOS5.1和更早的版本中无效。否则,默认实现将使用您设置的任何约束来确定任何子视图的大小和位置。
子类可以根据需要重写此方法,以执行更精确的子视图布局。只有当子视图的自动调整和基于约束的行为不提供您想要的行为时,您才应该重写此方法。您可以使用自定义实现直接设置子视图的框架矩形。
您不应该直接调用这个方法。如果您想强制进行布局更新,请在下一次绘图更新之前调用setNeedsLayout方法。如果您想立即更新视图的布局,请调用layoutIfNeeded方法。
setNeedsDisplay
You can use this method or the setNeedsDisplayInRect: to notify the system that your view’s contents need to be redrawn. This method makes a note of the request and returns immediately. The view is not actually redrawn until the next drawing cycle, at which point all invalidated views are updated.
Note
If your view is backed by a CAEAGLLayer object, this method has no effect. It is intended for use only with views that use native drawing technologies (such as UIKit and Core Graphics) to render their content.
You should use this method to request that a view be redrawn only when the content or appearance of the view change. If you simply change the geometry of the view, the view is typically not redrawn. Instead, its existing content is adjusted based on the value in the view’s contentMode property. Redisplaying the existing content improves performance by avoiding the need to redraw content that has not changed.您可以使用此方法或setNeedsDisplayInRect:通知系统您的视图的内容需要重新绘制。此方法记录请求并立即返回。在下一次绘图循环之前,视图不会被重新绘制,此时所有失效的视图都会被更新。
请注意
如果视图由CAEAGLLayer对象支持,则此方法无效。它只适用于使用本机绘图技术(如UIKit和Core Graphics)呈现内容的视图。
您应该使用此方法来请求仅在视图的内容或外观发生更改时重新绘制视图。如果您只是更改视图的几何结构,那么通常不会重新绘制视图。相反,它现有的内容是根据视图的contentMode属性中的值进行调整的。重新显示现有内容可以通过避免重新绘制未更改的内容来提高性能。