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

Posted

技术标签:

【中文标题】谁负责在自定义 UIViewController 容器中调用 viewWillLayoutSubviews()/viewDidLayoutSubviews()?【英文标题】:Who's responsible for calling viewWillLayoutSubviews()/viewDidLayoutSubviews() in a custom UIViewController container? 【发布时间】:2014-11-04 18:34:18 【问题描述】:

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

UIViewController 的beginAppearanceTransition(_:animated:) 被记录为触发viewWillAppear()viewWillDisappear()viewDidAppear()viewDidDisappear() 的正确方法,但我看不到viewWillLayoutSubviews() / viewDidLayoutSubviews() 的等价物。

尽我所能,父视图控制器(在这种情况下通过presentViewController(_:animated:completion:) 呈现)负责在其自己的相同方法实现中调用其子控制器viewWillLayoutSubviews() / viewDidLayoutSubviews()。框架似乎在某些情况下调用这些方法(比如当你设置UIWindowrootViewController 属性时)而不是其他情况下(比如当你在UIViewController 中调用addChildViewController() 时)。

这是正确、惯用的处理方式吗?

【问题讨论】:

【参考方案1】:

谁负责调用 viewWillLayoutSubviews 和 viewDidLayoutSubviews?

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

【讨论】:

super 实现除外。 也许我应该更清楚。如果是运行时,那么如何让它在自定义容器内的 UIViewController 对象上调用它们? 运行时进行布局。运行时将调用它们。如果你认为他们没有被调用,那么你需要问一个关于 that 的问题,表明你已经正确添加了你的视图控制器及其视图等。但这不是你问的问题;我试图回答你确实提出的问题。答案是:如果你打电话给他们,请停止。 @IanMacDonald 它确实在文档中说“超级”实现什么都不做。 (尽管这样称呼它可能是更多的未来证明。) 好的,但不知何故,孩子viewDidLayoutSubviews 在父母的viewDidLayoutSubviews 之后打电话。这很奇怪,由于子 VC 的视图是子视图的子视图,所以应该先布局,然后再调用 CHILD VC 的 viewDidLayoutSubviews,然后再调用 PARENT VC 的 viewDidLayoutSubviews... 如果你在 PARENT viewDidLayoutSubviews 中获取 CHILD 视图的高度,这可能是不正确的。【参考方案2】:

基本上,当视图的边界因任何原因发生变化时。根据Apple's docs:

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

【讨论】:

以上是关于谁负责在自定义 UIViewController 容器中调用 viewWillLayoutSubviews()/viewDidLayoutSubviews()?的主要内容,如果未能解决你的问题,请参考以下文章

同时在自定义 UIView 和 UIViewController 中使用相同的 UITextFieldDelegate 方法

Datepicker 不会显示在自定义 UITableViewCell 类中

在自定义 UIView 中为部分自动调整 UITableView

如何在自定义 UITableViewCell 中创建 UIImageVIew? (迅速)

如何让 .xib 出现在自定义类中

未在自定义 UISearchBar 中获取过滤器数据