需要有关 viewDidLayoutSubviews 的帮助

Posted

技术标签:

【中文标题】需要有关 viewDidLayoutSubviews 的帮助【英文标题】:Need assistance regarding viewDidLayoutSubviews 【发布时间】:2015-09-20 11:41:17 【问题描述】:

关于viewDidLayoutSubviews 的苹果文档说:

当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法。但是,调用此方法并不表示 视图的子视图的单独布局已调整。每个 subview 负责调整自己的布局。

您的视图控制器可以覆盖此方法以在视图布置其子视图后进行更改。此的默认实现 方法什么都不做。

我有view1,其中包含view2 意味着view2view1 的子视图。我正在为我的view2 创建一个CALayer,我希望它的大小与view2 完全相同。我正在使用auto layouts,所以我想在auto layout 完成工作时创建CALayer,这样我就可以为CALayer 框架设置正确的值。

但在viewDidLayoutSubviews 方法中,我无法检测到view2 框架何时由auto layout 设置,因为Apple doc 也这么说

这个方法被调用并不表示个人 视图的子视图布局已调整。

Apple 文档说之后

您的视图控制器可以覆盖此方法以在之后进行更改 视图展示了它的子视图。

我很困惑auto layout 会在什么时候设置view2 框架,所以我可以相应地设置我的CALayer 框架。

【问题讨论】:

如果您只需要您的图层自动调整边界 - 只需将 layerClass 方法覆盖到您的图层 @Sega-Zero 请你提供一个小例子或sn-p,这将非常有帮助。 ***.com/a/726712/1254172 但是我仍然无法弄清楚自动布局何时会完成它的工作,我的特定视图何时会有它的框架以及我何时可以使用框架值(用于任何目的)。 viewDidLayoutSubviews 是确保视图控制器视图的子视图正确对齐的正确位置,但它不是您可以确定它们相应显示在屏幕上的位置。而且它不是您可以确定根子视图的所有子视图都对齐的地方 - 这是子视图的责任(文档说得很清楚)。通常,使用自动布局,您不需要做任何额外的工作。但是你总是可以覆盖setFrame: 方法来捕捉特定视图的正确位置。 【参考方案1】:

正如我在 cmets 中提到的,如果您的视图与自动布局对齐,则无需执行任何特殊操作。如果您希望单个图层将其边界调整为视图的边界,最简单和正确的方法是覆盖视图的layerClass 方法 - 在这种情况下,图层边界将在视图内自动调整。如果除了标准层之外还需要一层,更新层边界的最佳位置可能是setFrame: 方法覆盖。

截至viewDidLayoutSubviews,它只是一个通知您的事件,viewcontroller 的根视图的所有子视图都位于所需的位置。您不能保证这些子视图的所有其余子视图也将对齐,因为这是父视图本身的责任。它们既可以是自动布局定位,也可以是手动布局定位。此事件也不能保证所有视图都按需要显示,尤其是在它们的帧更改为动画的情况下。

【讨论】:

以上是关于需要有关 viewDidLayoutSubviews 的帮助的主要内容,如果未能解决你的问题,请参考以下文章

Swift:viewDidLayoutSubviews 是啥意思?

为啥 viewDidLayoutSubviews 会干扰动画?

viewDidLayoutSubviews 中的 UIImageView 宽度是 1000?

等效于 UITableViewCell 的 viewDidLayoutSubviews

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

在 viewDidLayoutSubviews() 中调用地图视图函数时,地图视图显示两次?