iOS AutoLayout:将自动布局锚点限制为其他两个锚点的最大值或最小值

iOS AutoLayout: Constrain autolayout anchor to max or min value of two other anchors

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

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

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

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

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

完成此任务的正确方法是什么?

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

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

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

Auto-layout 将告诉 RectC 的宽度为:

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

由于“equalTo”约束的优先级为 less-than required 它们 可以被破坏 ...auto-layout 将打破 Step 2,满足 1、3 和 4,RectC 将是 200 点宽。

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

Auto-layout 将告诉 RectC 的宽度为:

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

由于“equalTo”约束的优先级为 less-than required 它们 可以被破坏 ...auto-layout 将打破 Step 1,满足 2、3 和 4,RectC 将是 220 点宽。