谁负责在自定义 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()
。框架似乎在某些情况下调用这些方法(比如当你设置UIWindow
的rootViewController
属性时)而不是其他情况下(比如当你在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