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

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

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

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

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

【问题讨论】:

    标签: ios cocoa-touch swift uiviewcontroller uikit


    【解决方案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 方法来确定设备方向。

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2015-10-08
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多