【问题标题】:What's exactly viewDidLayoutSubviews?究竟什么是 viewDidLayoutSubviews?
【发布时间】:2016-11-22 08:38:47
【问题描述】:

我正在阅读UIViewControllerviewDidLayoutSubviews的描述:

被调用来通知视图控制器它的视图刚刚布局了它的子视图[...] 但是,这个方法被调用并不表示视图的子视图的各个布局已经被调整。每个子视图负责调整自己的布局 [...]。

对我来说,这意味着:“当子视图的布局完成时调用,但实际上这不是真的”。那么viewDidLayoutSubviews 背后的真正含义是什么?

【问题讨论】:

    标签: ios uiviewcontroller uikit bounds viewdidlayoutsubviews


    【解决方案1】:

    当 ViewControllers 视图的边界发生变化时,在子视图的位置和大小发生变化后调用此方法。

    1. 所以这是我们在布局子视图之后但在屏幕上可见之前对视图进行更改的机会。

    2. 必须根据边界进行任何更改,我们可以在此处进行,而不是在 ViewDidLoad 或 ViewWillAppear 中进行。

    3. 在 ViewDidLoad 和 ViewWillAppear 时,视图的框架和边界是 未定稿。因此,当 AutoLayout 完成后,它的工作就是修复 mainView 和 是子视图,调用这个方法。

    使用自动布局时,框架不会每次都调用 layoutSubviews。在这些情况下会调用它。

    • 旋转设备:仅在父视图(响应的 viewControllers 主视图)上调用 layoutSubview

    • 它自己的边界(不是框架)发生了变化。 (仅当新值不同时,边界才被视为更改,包括不同的原点。)

    • 子视图被添加到视图中或从视图中删除。
    • 您的应用程序通过调用视图的setNeedsLayoutlayoutIfNeeded 方法来强制进行布局。
    • 滚动 UIScrollView 会导致在 scrollView 及其父视图上调用 layoutSubviews。

    注意: viewDidLayoutSubviews 的调用还取决于各种因素,例如自动调整掩码、是否使用自动布局以及视图是否在视图层次结构中。

    如需任何其他说明,请查看When is layoutSubviews called?

    【讨论】:

    • 不确定你的答案是否正确:当我修改子视图的大小时,viewDidLayoutSubviews 没有被系统地调用。
    • @MartinMoizard : 调整视图大小将在其父视图上调用 layoutSubviews
    • 解释得很好
    【解决方案2】:

    viewDidLayoutSubviews 会被调用

    当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法。

    例如,您设置了视图的constraints,然后您想更新viewDidLoad() 中子视图的框架,这不会产生任何影响,因为viewDidLoad() 您的constraints 设置不正确,它们将在viewDidLayoutSubviews 被调用时正确设置,现在您想要更新子视图的框架,那么您可以在此方法中执行此操作,因为只有在正确设置视图的所有约束后才会调用此方法。

    【讨论】:

      猜你喜欢
      • 2014-10-28
      • 2012-08-27
      • 2010-11-12
      • 2011-03-18
      • 2011-01-22
      • 1970-01-01
      相关资源
      最近更新 更多