什么是viewDidLayoutSubviews?

时间:2016-11-22 08:38:47

标签: ios uikit

我正在阅读viewDidLayoutSubviews的{​​{1}}的说明:

  

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

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

2 个答案:

答案 0 :(得分:17)

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

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

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

  3. ViewDidLoad& ViewWillAppear,视图的框架和边界 没有最终确定。因此,当AutoLayout完成它修复mainView的工作时 它的子视图,这个方法被称为。

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

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

    • 它自己的边界(不是框架)改变了。 (只有当新值不同,包括不同的原点时,才会考虑更改边界。)

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

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

    如有任何其他说明,请查看When is layoutSubviews called?

答案 1 :(得分:0)

时会调用

viewDidLayoutSubviews

  

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

例如,您已设置了视图的constraints,那么您希望在viewDidLoad()中更新子视图的框架,这不会像viewDidLoad() constraints那样产生任何影响没有正确设置,它们会在调用viewDidLayoutSubviews时正确设置,现在你想要更新子视图的帧,然后你可以在这个方法中做到这一点,因为只有在所有约束之后调用此方法您的观点已正确设置。