【问题标题】:iOS AutoLayout: Constrain autolayout anchor to max or min value of two other anchorsiOS AutoLayout:将自动布局锚限制为其他两个锚的最大值或最小值
【发布时间】:2021-01-09 08:07:48
【问题描述】:

在创建自动布局约束时,我经常希望将 UIView 的锚点约束到其他两个锚点的更高(或更低)值。

以下 GIF 显示了我希望向自动布局引擎表达的约束示例。在本例中,我将矩形 C 的宽度限制为矩形 A 和矩形 B 宽度的最大值。因此,如果我更改矩形 A 和 B 的宽度,矩形 C 会相应地缩放。

目前,我知道的唯一方法似乎是说:

  • 矩形C的宽度必须大于等于矩形A的宽度
  • 矩形C的宽度必须大于等于矩形B的宽度

但是,这种方法存在使矩形 C 的宽度不明确的重大问题(因为上述两个约束都不是“精确”约束)。

现在,在您说自动布局无法实现这一点之前,我想指出,据我所知,自动布局只是一个线性优化器。最小和最大约束是您可以指定给线性优化器的标准内容。

实现此目的的正确方法是什么?

【问题讨论】:

    标签: ios autolayout uikit linear-programming


    【解决方案1】:

    您可以应用多个相同的约束条件,前提是它们不相互冲突。在这种情况下,您必须这样做。

    • RectC:与 Priority: 750 (High) 的 RectA 等宽
    • RectC:与带有Priority: 750 (High) 的 RectB 等宽
    • RectC:GreaterThanOrEqual 与 RectA 的宽度为 Priority: 1000 (Required)
    • RectC:大于或等于 RectB 的宽度,Priority: 1000 (Required)

    所以,假设 RectA 的宽度为 200,而 RectB 的宽度为 120...

    自动布局会告诉 RectC 的宽度是:

    • 步骤 1 ... 等于 A (200)
    • 第 2 步 ... 等于 B (120)
    • 第 3 步 ... >= 到 A (200)
    • 步骤 4 ... >= 到 B (120)

    由于“equalTo”约束的优先级低于要求,它们可以被破坏...自动布局将被破坏Step 2,满足 1、3 和 4,RectC 将是 200-pts 宽。

    同样,假设 RectA 的宽度为 160,而 RectB 的宽度为 220...

    自动布局会告诉 RectC 的宽度是:

    • 第 1 步 ... 等于 A (160)
    • 第 2 步 ... 等于 B (220)
    • 第 3 步 ... >= 到 A (160)
    • 步骤 4 ... >= 到 B (220)

    由于“equalTo”约束的优先级低于要求,它们可以被破坏...自动布局将被破坏Step 1,满足 2、3 和 4,RectC 将是 220 点宽。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多