我正在阅读viewDidLayoutSubviews
的{{1}}的说明:
调用以通知视图控制器其视图刚刚布置了其子视图[...]但是,此方法被调用并不表示视图的子视图的各个布局已被调整。每个子视图负责调整自己的布局[...]。
对我来说,这意味着:“当子视图的布局完成时调用,但实际上这不是真的”。那么UIViewController
背后的真正原因是什么?
答案 0 :(得分:17)
当ViewControllers视图的边界发生变化时,在子视图的位置和大小发生变化后调用此方法。
因此,我们有机会在布局子视图之后,但在屏幕上显示之前对视图进行更改。
必须完成任何取决于边界的更改,我们可以在这里进行,而不是在ViewDidLoad或ViewWillAppear中进行。
ViewDidLoad& ViewWillAppear,视图的框架和边界 没有最终确定。因此,当AutoLayout完成它修复mainView的工作时 它的子视图,这个方法被称为。
使用autolayout时,框架不会每次都调用layoutSubviews。在这些情况下会调用它。
旋转设备:仅在父视图上调用layoutSubview(响应的viewControllers主视图)
它自己的边界(不是框架)改变了。 (只有当新值不同,包括不同的原点时,才会考虑更改边界。)
setNeedsLayout
或layoutIfNeeded
方法来强制进行布局。注意: 对viewDidLayoutSubviews的调用还取决于各种因素,如自动调整大小掩码,是否使用自动布局,以及视图是否在视图层次结构中。
如有任何其他说明,请查看When is layoutSubviews called?
答案 1 :(得分:0)
viewDidLayoutSubviews
当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法
例如,您已设置了视图的constraints
,那么您希望在viewDidLoad()
中更新子视图的框架,这不会像viewDidLoad()
constraints
那样产生任何影响没有正确设置,它们会在调用viewDidLayoutSubviews
时正确设置,现在你想要更新子视图的帧,然后你可以在这个方法中做到这一点,因为只有在所有约束之后调用此方法您的观点已正确设置。