谁负责在自定义UIViewController容器中调用viewWillLayoutSubviews()/ viewDidLayoutSubviews()?

时间:2014-11-04 18:34:18

标签: ios cocoa-touch swift uiviewcontroller uikit

创建自定义UIViewController容器(包含其他UIViewControllers及其视图的UIViewController)谁负责调用viewWillLayoutSubviewsviewDidLayoutSubviews?我的容器类有两个子控制器,当它移动到父视图控制器时,它们都没有调用这些方法。

UIViewController的beginAppearanceTransition(_:animated:)被记录为触发viewWillAppear()viewWillDisappear()viewDidAppear()viewDidDisappear()的正确方式,但我看不到{{ 1}} / viewWillLayoutSubviews()

最好我可以看出父视图控制器(在这种情况下通过presentViewController(_:animated:completion:)呈现)负责在其自己的实现中调用其子控制器viewDidLayoutSubviews() / viewWillLayoutSubviews()那些相同的方法。框架似乎在某些情况下调用这些方法(例如,当您设置viewDidLayoutSubviews()的{​​{1}}属性时),而不是其他方式(例如,当您在rootViewController中调用UIWindow时)。

这是正确的,惯用的方式吗?

2 个答案:

答案 0 :(得分:3)

  

谁负责调用viewWillLayoutSubviews和viewDidLayoutSubviews?

运行时。你不应该自己调用这些方法。

答案 1 :(得分:0)

基本上,当视图的边界由于任何原因而改变时。根据{{​​3}}:

  

当可见视图控制器发生旋转时,将在旋转期间调用willRotate(to:duration :),willAnimateRotation(to:duration :)和didRotate(from :)方法。在视图被其父级调整大小并定位后,还会调用viewWillLayoutSubviews()方法。如果在发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图变为可见时,将调用viewWillLayoutSubviews()方法。您可以使用此方法的实现调用statusBarOrientation方法来确定设备的方向。