什么是 viewDidLayoutSubviews?

What's exactly viewDidLayoutSubviews?

我正在阅读 UIViewControllerviewDidLayoutSubviews 的描述:

Called to notify the view controller that its view has just laid out its subviews [...] However, this method being called does not indicate that the individual layouts of the view's subviews have been adjusted. Each subview is responsible for adjusting its own layout [...].

对我来说,这意味着:"Called when the layout of subviews is complete, but actually this is not true"。那么 viewDidLayoutSubviews 背后的真相是什么?

viewDidLayoutSubviews 将在

时调用

When the bounds change for a view controller's view, the view adjusts the positions of its subviews and then the system calls this method.

例如,您已经设置了 constraints 视图,然后您想要更新 viewDidLoad() 中子视图的框架,这不会像在 viewDidLoad() 中那样对您的 constraints 没有正确设置,当 viewDidLayoutSubviews 被调用时它们将被正确设置,现在你想更新你的子视图的框架,那么你可以在这个方法中这样做,因为这个方法毕竟只被调用您的视图的约束已正确设置。

当 ViewControllers 视图的边界发生变化时,此方法将在子视图的位置和大小发生变化后调用。

  1. 所以这是我们在子视图布局之后但在屏幕上可见之前对视图进行更改的机会。

  2. 必须根据边界进行任何更改,我们可以在这里进行,而不是在 ViewDidLoad 或 ViewWillAppear 中进行。

  3. 当ViewDidLoad & ViewWillAppear时,view的frame和bounds是 没有最终确定。因此,当 AutoLayout 完成修复 mainView 和 它是子视图,调用此方法。

使用自动布局时,框架不会每次都调用layoutSubviews。在这些情况下会调用它。

  • 旋转设备: 仅在父视图(响应的 viewControllers 主视图)上调用 layoutSubview

  • 它自己的边界(不是框架)改变了。 (仅当新值不同(包括不同的来源)时,才认为边界已更改。)

  • 子视图已添加到视图或从视图中删除。
  • 您的应用程序通过调用视图的 setNeedsLayoutlayoutIfNeeded 方法强制进行布局。
  • 滚动 UIScrollView 会导致在 scrollView 及其父视图上调用 layoutSubviews。

注意: viewDidLayoutSubviews 的调用还取决于各种因素,例如自动调整大小掩码、是否使用自动布局以及视图是否在视图层次结构中。

如需任何其他说明,请检查 When is layoutSubviews called?