9

我正在阅读以下内容的viewDidLayoutSubviews描述UIViewController

被调用来通知视图控制器它的视图刚刚布置了它的子视图 [...] 但是,这个方法被调用并不表示视图子视图的各个布局已经被调整。每个子视图负责调整自己的布局 [...]。

对我来说,这意味着:“当子视图的布局完成时调用,但实际上这不是真的”。那么真正的背后是viewDidLayoutSubviews什么?

4

2 回答 2

23

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

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

  2. 任何取决于边界的更改都必须完成,我们可以在这里而不是在 ViewDidLoad 或 ViewWillAppear 中进行。

  3. 在 ViewDidLoad 和 ViewWillAppear 中,视图的框架和边界尚未最终确定。因此,当 AutoLayout 完成修复 mainView 及其子视图的工作时,就会调用此方法。

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

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

  • 它自己的界限(不是框架)发生了变化。(仅当新值不同时,边界才被认为已更改,包括不同的原点。)

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

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

有关任何其他说明,请检查 何时调用 layoutSubviews?

于 2016-11-22T09:40:43.480 回答
1

viewDidLayoutSubviews将在何时调用

当视图控制器视图的边界发生变化时,视图会调整其子视图的位置,然后系统调用此方法。

例如,您已经设置constraints了视图,然后您想在 中更新子视图的框架viewDidLoad(),这不会产生任何影响,因为viewDidLoad()constraints的设置不正确,它们会在viewDidLayoutSubviews被调用时正确设置,现在您要更新框架您的子视图,那么您可以在此方法中执行此操作,因为只有在正确设置视图的所有约束后才会调用此方法。

于 2016-11-22T08:46:32.587 回答