setNeedsLayout 与 setNeedsUpdateConstraints 和 layoutIfNeeded 与 updateConstraintsIfNeeded

2023-12-13

我知道自动布局链基本上由 3 个不同的过程组成。

  1. 更新约束
  2. 布局视图(这是我们计算帧的地方)
  3. display

我不完全清楚的是两者之间的内在区别-setNeedsLayout and -setNeedsUpdateConstraints。来自苹果文档:

设置需求布局

当您需要时,可以在应用程序的主线程上调用此方法 调整视图子视图的布局。该方法记录了 请求并立即返回。因为该方法不 强制立即更新,但等待下一次更新 循环,你可以用它来使多个视图的布局失效 在更新任何这些视图之前。此行为使您能够 将所有布局更新合并到一个更新周期,即 通常更有利于性能。

设置需求更新约束

当自定义视图的属性发生变化时会影响 约束,可以调用该方法来表明约束 需要在将来的某个时候进行更新。然后系统将 调用 updateConstraints 作为其正常布局过程的一部分。更新中 在需要约束之前立即全部约束确保您 当进行多个更改时,不要不必要地重新计算约束 在布局过程之间对您的视图进行调整。

当我想在修改约束后对视图进行动画处理并对更改进行动画处理时,我通常会调用以下命令:

[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.modifConstrView setNeedsUpdateConstraints];
        [self.modifConstrView layoutIfNeeded];
    } completion:NULL];

我发现如果我使用-setNeedsLayout代替-setNeedsUpdateConstraints一切都按预期进行,但如果我改变-layoutIfNeeded with -updateConstraintsIfNeeded,动画不会发生。
我试图做出自己的结论:

  • -updateConstraintsIfNeeded仅更新约束,但不强制布局进入该过程,因此仍保留原始帧
  • -setNeedsLayout还打电话-updateContraints method

那么什么时候可以使用其中一种而不是另一种呢?关于布局方法,我是否需要在约束发生更改的视图或父视图上调用它们?


你的结论是对的。基本方案是:

  • setNeedsUpdateConstraints确保将来致电updateConstraintsIfNeeded calls updateConstraints.
  • setNeedsLayout确保将来致电layoutIfNeeded calls layoutSubviews.

When layoutSubviews被调用,它也调用updateConstraintsIfNeeded,因此根据我的经验,很少需要手动调用它。事实上,除了调试布局时,我从未调用过它。

使用更新约束setNeedsUpdateConstraints也是相当罕见的,objc.io——关于自动布局的必读——说:

如果稍后发生某些变化导致您的约束之一无效,您应该立即删除该约束并调用 setNeedsUpdateConstraints。事实上,这是您必须触发约束更新传递的唯一情况。

此外,根据我的经验,我从来没有必要使约束无效,也不必设置setNeedsLayout在代码的下一行中,因为新的约束几乎要求新的布局。

经验法则是:

  • 如果您直接操纵约束,请调用setNeedsLayout.
  • 如果您更改了某些条件(例如偏移量或其他)would改变被覆盖的约束updateConstraints方法(更改约束的推荐方法,顺便说一句),调用setNeedsUpdateConstraints,而且大多数时候,setNeedsLayout在那之后。
  • 如果您需要上述任何操作立即生效,例如当您需要在布局传递后学习新的框架高度时,请在其后附加layoutIfNeeded.

另外,在你的动画代码中,我相信setNeedsUpdateConstraints是不需要的,因为约束是在动画之前手动更新的,并且动画仅根据新旧视图之间的差异重新布局视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

setNeedsLayout 与 setNeedsUpdateConstraints 和 layoutIfNeeded 与 updateConstraintsIfNeeded 的相关文章

随机推荐

  • 有效使用 UncaughtExceptionHandler

    我最近了解了 Java 1 5 的这个功能 并开发了一个示例代码来使用它 我的目标是当线程由于未捕获的异常而死亡时重新启动线程 public class ThreadManager public static void main Strin
  • 为什么标签小部件中的文本周围出现难看的大括号? - Tkinter

    我的标签小部件中的文本周围有大括号 输出是 Total tries 0 代替Total tries 0 这是我的代码的简短版本 class Cell def check self mem tries 1 mem update tries c
  • UISearchController更新搜索结果问题

    我的问题是我已经实施了UISearchController在 Swift 3 中 当我尝试过滤它时 它很容易过滤简单数组 但我的情况有点不同 我有一个数组 我从中获取所有数据SQLite database在类中 所以它是类的数组 manag
  • 断开各个对等点与 MCSession 的连接?

    如果我有一组已连接的对等点 假设有 3 个 a gt b a gt c a gt d 我只想断开对等点 c 的连接 我应该做什么 我看到对类似问题的一个答复指出 您只能断开 您自己 与会话的连接 这意味着在上述情况下 如果我这样做 mySe
  • 在 MATLAB GUIDE 中显示大型文本文件的最佳方式是什么?

    如何使用 MATLAB GUIDE 控件在 GUI 中显示文本文件的内容 文本文件可能很长或很宽 因此它应该能够具有垂直和水平滚动条 多行编辑框可能是显示文本的最佳选择 例子 read text file lines as cell arr
  • 函数可选参数DATE类型失败

    我有一个函数可以查找下周一的日期 当没有传递可选日期参数时 它将变为默认值零 我想我已经添加了注释来解释问题 Function NextMondayFromADateOrToday Optional StartDate As Date As
  • 如何沿矩阵轴执行滚动求和?

    给定矩阵X with T行和列k T 50 H 10 k 5 X np arange T reshape T 1 np ones T k 如何执行滚动累积和X沿着行轴有滞后H Xcum np zeros T H k for t in ran
  • 如果我不“删除”会发生什么? [复制]

    这个问题在这里已经有答案了 如果我在执行期间分配一些内存但从不调用会发生什么delete程序终止 操作系统会释放我分配的所有内存并且不会 浪费 任何内存吗 或者在计算机重新启动之前我会丢失一部分内存吗 显然 我知道良好的编码实践是确保删除不
  • XSLT:多次复制对象 xml,同时递增属性和值

    我有一个如下所示的 xml 我想复制 n 次 同时递增其元素之一和属性之一 XML 输入
  • XNA 处理按键组合

    我已经阅读了一些涉及此问题的文章 但是在尝试实施一些之后 总是遇到同样的问题 快速说明 这是家庭作业 我正在使用 XNA 为我的游戏设计课程重新创建 Super Smash Brothers N64 风格 现在我有两个问题密切相关 熟悉 S
  • Maven 依赖项在 WEB-INF/lib 中不可见

    我在使我的项目基于 Maven 时遇到了这个奇怪的问题 我创建了一个新的Maven在 Eclipse 中创建项目并启用动态 Web 方面 但在运行时现在它会抛出ClassNotFoundException因为 Maven 依赖项没有复制到W
  • 子查询上的 GROUP_CONCAT 的奇怪结果

    在子查询上使用 GROUP CONCAT 时 我有一个奇怪的行为 这是我的查询 SELECT name GROUP CONCAT DISTINCT id SEPARATOR AS id FROM SELECT APN AS name GRO
  • 如何转换为模板类型?

    在 gdb 中 如果你有一个指向某个东西的指针 你可以在打印它之前对其进行转换 例如 这有效 print int 0xDEADBEEF 但是 如何打印std vector
  • 为什么 Map 不能在 chrome/node 中进行子类化?

    所以 ES 6 给我们带来了Maps 而且不会太快 为了实现我自己的邪恶目的 我希望对 Map 进行子类化 我尝试了以下操作 为了清楚起见 进行了缩写 function Foo return Map apply this slice cal
  • 添加突出显示不适用于 Elasticsearch 2.3.3 中的 has_child 查询

    当我使用 hasChildQuery 时 一切正常 但是当我添加addHighlightedField 方法 它不起作用 以下是我的代码 TermsLookupQueryBuilder terms QueryBuilders termsLo
  • 从 Angular 中的自定义表单组件访问 FormControl

    我的 Angular 应用程序中有一个自定义表单控制组件 它实现了ControlValueAccessor界面 但是 我想访问FormControl实例 与我的组件关联 我正在使用反应式形式FormBuilder并使用提供表单控制formC
  • Gnuplot 工作流程涉及多重绘图的拟合循环

    我想在 gnuplot 中执行以下操作 读取我的文件 这些文件被方便地标记为 filenameN txt 其中 N 是第 N 个文件 使用 aN bN 将一些多项式 fN x 拟合到数据中 并使用 multiplot 将所有这些绘制在单个图
  • 有反向映射功能吗?

    在 clojure 中 您可以将函数映射到值序列 是否有一个内置函数可以将单个值作为参数映射到一系列函数 map inc 1 2 3 4 gt 2 3 4 5 reverse map inc dec str 1 gt 2 0 1 rever
  • 什么是spark.python.worker.memory?

    谁能给我更准确地描述这个 Spark 参数以及它如何影响程序执行 我无法从文档中确切地看出这个参数 在幕后 的作用 该参数影响 Python 工作线程的内存限制 如果Python工作进程的RSS大于内存限制 那么它会将数据从内存溢出到磁盘
  • setNeedsLayout 与 setNeedsUpdateConstraints 和 layoutIfNeeded 与 updateConstraintsIfNeeded

    我知道自动布局链基本上由 3 个不同的过程组成 更新约束 布局视图 这是我们计算帧的地方 display 我不完全清楚的是两者之间的内在区别 setNeedsLayout and setNeedsUpdateConstraints 来自苹果