什么是viewDidLayoutSubviews?
我正在阅读UIViewController
的viewDidLayoutSubviews
的描述:
被调用以通知视图控制器其视图刚刚布置了其子视图[…]但是,此方法被调用并不表示已调整视图子视图的各个布局。 每个子视图负责调整自己的布局[…]。
对我来说,这意味着:“当子视图的布局完成时调用,但实际上这不是真的”。 那么viewDidLayoutSubviews
背后的真正原因是什么?
当ViewControllers视图的边界更改时,在子视图的位置和大小发生更改后调用此方法。
-
因此,这是我们在布局了子视图之后,但在屏幕上显示之前对视图进行更改的机会。
-
任何取决于边界的更改都必须完成,我们可以在此处而不是在ViewDidLoad或ViewWillAppear中完成。
-
在ViewDidLoad和ViewWillAppear中,视图的边框和边界尚未最终确定。 因此,当AutoLayout完成修复mainView及其子视图的工作时,会调用此方法。
使用autolayout时,框架不会每次都调用layoutSubviews。 在这些情况下调用它。
-
旋转设备:仅在父视图上调用layoutSubview(响应的viewControllers主视图)
-
它自己的边界(不是框架)改变了。 (仅当新值不同,包括不同的原点时,才会认为边界已更改。)
- 子视图将添加到视图中或从视图中删除。
- 您的应用程序通过调用视图的
setNeedsLayout
或layoutIfNeeded
方法来强制进行布局。 - 滚动UIScrollView会导致在scrollView及其superview上调用layoutSubviews。
注意:对viewDidLayoutSubviews的调用还取决于各种因素,如自动resize掩码,是否使用自动布局,以及视图是否在视图层次结构中。
对于任何其他说明,请检查何时调用layoutSubviews?
viewDidLayoutSubviews
将在何时调用
当视图控制器视图的边界发生更改时,视图会调整其子视图的位置,然后系统会调用此方法。
例如,您已设置视图的constraints
,然后您想在viewDidLoad()
更新子视图的框架,这不会产生任何影响,因为在viewDidLoad()
您的constraints
未正确设置,当viewDidLayoutSubviews
获得时,它们将得到正确设置调用,现在要更新子视图的帧,然后可以在此方法中执行此操作,因为只有在正确设置了视图的所有约束后才会调用此方法。