问题描述
在创建自动布局约束时,我经常想将UIView
的锚点限制为其他两个锚点的较高(或较低)值。
以下GIF展示了我想表达给自动布局引擎的约束示例。在这种情况下,我将矩形C的宽度限制为矩形A和B的宽度的最大值。因此,如果更改矩形A和B的宽度,矩形C会相应缩放。
目前看来,我知道的唯一方法是说:
- 矩形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点。