gpt4 book ai didi

ios - 自动布局:updateConstraints 不会在方向更改时得到调用

转载 作者:行者123 更新时间:2023-12-01 17:25:04 29 4
gpt4 key购买 nike

我正在学习自动布局在 iOS 中的工作原理。为此,我创建了一个示例单 View 应用程序,它具有一个 View Controller (它是初始 View Controller )和一个自定义 View (我们称之为示例 View )。我在 Main.storyboard 的 View Controller 中添加了示例 View ,并带有自动布局约束。我在带有自动布局约束的示例 View 中添加了一个按钮和一个标签。我覆盖了 SampleView.m 中的 layoutSubviews 和 updateConstraints 方法。这些被覆盖的方法除了调用它们的 super 实现之外什么都不做。我为这两种方法添加了一个断点并开始调试应用程序。以下是我的观察

  • 我发现在 SampleView 中的 layoutSubviews 方法之前调用了 updateConstraints。但是,我阅读了一些帖子/答案,其中提到 layoutSubviews 在 updateConstraints 之前被调用。现在我很困惑什么是正确的机制?在 layoutSubviews 之前调用 updateConstraint,反之亦然。自动布局系统如何工作?
  • 当我将设备从纵向旋转到横向或从横向旋转到纵向时,我发现 SampleView 的 updateConstraints 方法不会自动调用(但是 layoutSubviews 方法会自动调用),而我读了一些帖子/答案,说旋转时, updateConstraints 方法自动调用。我再次困惑哪一个是真的?
  • 如果 updateConstrains 方法在方向更改时没有自动调用,那么当方向更改时,我们如何在 View 层次结构中的所有 View 上调用 updateConstraint 方法?会在父 View 上调用 setNeedsUpdateConstraint 吗,会在该 View 的所有 subview 上调用 updateConstraint 吗?
  • 最佳答案

    排版流程一般是这样工作的:

    第一步:更新约束,发生自下而上。通过调用 [view setNeedsUpdateConstraints] 触发,覆盖自定义 View 的 [view updateConstraints]。这一步解决了约束。

    第二步:布局,发生自上而下。通过调用 [view setNeedsLayout]、[view layoutIfNeeded] 触发,覆盖自定义 View 的 [view layoutSubviews]。当 layoutSubviews 被调用时,我们有框架。

    第三步:显示,发生自上而下。通过调用 [view setNeedsDisplay] 触发,覆盖自定义 View 的 [view drawRect:]。

    所以,

  • updateConstraints 发生在 layoutSubviews 之前。约束基本上是添加到 View 的父 View 中的对象,描述了如何布局父 View 的 subview 。所以你确实需要更新约束在布局发生之前。
  • 在方向更改时,约束没有改变,因此我认为不会调用 updateConstraints。
  • 当方向改变时,我们如何在 View 层次结构中的所有 View 上调用 updateConstraint 方法?约束不需要更新,因为它们是 View 应该如何相互关联的方式。相反,当方向改变时,最顶层 View (UIWindow) 的框架将被更新,因此它的所有 subview 都需要更新它们的框架才能 符合约束 您之前已设置。

  • 如果我错了,请纠正我:)

    关于ios - 自动布局:updateConstraints 不会在方向更改时得到调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31400258/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com