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

问题描述

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

以下GIF展示了我想表达给自动布局引擎的约束示例。在这种情况下,我将矩形C的宽度限制为矩形A和B的宽度的最大值。因此,如果更改矩形A和B的宽度,矩形C会相应缩放。

Autolayout

目前看来,我知道的唯一方法是说:

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

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

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

完成此操作的正确方法是什么?

解决方法

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

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

因此,假设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点。

同样,假设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点。