我对Cocoa的Autolayout如何确定布局是否含糊不清感到困惑。这是一个简单的例子:
观察到的行为如下。绿色矩形左侧和右侧的垫片总是宽度相同。当您将超视图水平向外拉伸时,间隔物会在矩形扩展时粘到80。当水平缩小超视图时,矩形会粘到398,而间隔缩小到10,之后矩形继续缩小。在任何一点上,IB的布局都不明确。
但是,您会注意到水平布局几乎完全由不等式定义!从我所看到的,当矩形的宽度> 398,没有理由间隔物的宽度为80.它们的宽度可以是10到80,并且仍然满足每个水平不等式。这对我来说听起来很模糊,但IB显然不同意。
必须有一些我错过的隐含规则。请帮帮我!
答案 0 :(得分:3)
巧合的是,自动布局模糊不清。因此,从应用程序中观察到的行为在技术上是未定义的。这正是文档中所说的:
约束具有优先级。在具有较低优先级的约束之前满足具有较高优先级的约束。默认优先级是必需的(NSLayoutPriorityRequired),这意味着必须完全满足约束。布局系统尽可能接近满足可选约束,即使它无法完全实现它。
因此要求
布局系统尽可能接近满足可选约束 必须严格满足优先级为1000的约束 在具有较低优先级的约束之前满足较高优先级约束
然而,正如你所注意到的那样 是什么原因导致间隔贪婪地扩展到80,而绿色矩形由于具有更高的优先级而最大扩展?
自动布局没有定义"尽可能关闭"和#34;在约束之前满足更高的修道院限制"以一种明确的方式。 Auto布局文档提到了这两个维度:优先级和贴近度;但是这些文件没有说明这些维度的优化是如何相互作用的。
话虽如此,基于自动布局可能是一个多变量线性分解求解器的事实,这里有一个关于自动布局如何运作的理论。
让我们考虑你的角落案例
当水平向外拉伸超视图时,当矩形扩展时,间隔物会粘到80上
当您水平收缩超级视图时,矩形会粘到398,而间隔符缩小到10
- 醇>
之后矩形继续缩小
这些角落案例可以简化为
注意数字如何从一个案例跳到另一个案例。间隔器中的案例A 与案例B 之间的连接顺畅,从80开始 - > 80在关键点。从案例B 到案例C 的矩形也是如此。在处理关键点时,自动布局使用的算法总能产生平滑的解决方案。