什么是viewDidLayoutSubviews?

我正在阅读UIViewControllerviewDidLayoutSubviews的描述:

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

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

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

  1. 因此,这是我们在布局了子视图之后,但在屏幕上显示之前对视图进行更改的机会。

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

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

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

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

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

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

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

对于任何其他说明,请检查何时调用layoutSubviews?

viewDidLayoutSubviews将在何时调用

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

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