不等式的自动布局歧义

Posted

技术标签:

【中文标题】不等式的自动布局歧义【英文标题】:Autolayout ambiguity with inequalities 【发布时间】:2014-07-27 20:07:53 【问题描述】:

我对 Cocoa 的自动布局如何确定布局是否模糊感到困惑。这是一个简单的例子:

观察到的行为如下。绿色矩形左侧和右侧的垫片始终具有相同的宽度。当您向外水平拉伸超级视图时,当矩形扩展时,垫片会保持 80。当您水平收缩超级视图时,矩形坚持到 398,而垫片收缩到 10,之后矩形继续收缩。 IB 在任何时候都不会将布局标记为模棱两可。

但是,您会注意到水平布局几乎完全由不等式定义!据我所见,当矩形的宽度大于 398 时,没有理由让垫片的宽度为 80。它们的宽度可以在 10 到 80 之间,并且仍然满足每个水平不等式。这对我来说听起来模棱两可,但 IB 显然不同意。

一定有一些我遗漏的隐含规则。请帮帮我!

【问题讨论】:

查看这些约束的优先级。你会明白的。 我不明白。我所描述的如何不模棱两可?优先事项如何影响不平等的解决方案? 让我们使用示例。您认为哪两个限制条件不明确? 绿色矩形的宽度约束为 >= 398,优先级 750。间隔的宽度约束为 使间隔扩展的约束是>=10(优先级1000)。 限制它无法进一步扩展。如您所见,>=10 约束具有更高的优先级。 【参考方案1】:

巧合的是,自动布局具有模棱两可的文档。因此,您从应用程序中观察到的行为在技术上是未定义的。这正是文档所说的:

约束具有优先级。具有较高优先级的约束先于具有较低优先级的约束得到满足。默认优先级是必需的(NSLayoutPriorityRequired),这意味着必须完全满足约束。布局系统尽可能接近满足可选约束,即使它不能完全实现它。

因此要求是

布局系统尽可能地满足可选约束 必须完全满足优先级为 1000 的约束 优先级较高的约束在优先级较低的约束之前得到满足

但是,正如您所注意到的 是什么导致 spacer 贪婪地扩展到 80,而绿色 rect 由于具有更高的优先级而最大程度地扩展?

自动布局没有以明确的方式定义“尽可能关闭”和“在约束之前满足更高的先验约束”。自动布局文档中提到了这两个维度:优先级和紧密度;但这些文件并没有说明这些维度的优化是如何相互作用的。

话虽如此,这里有一个关于自动布局如何运行的理论,基于自动布局可能是一个多变量线性分解求解器这一事实。


让我们考虑一下你的极端情况

    当您水平向外拉伸超级视图时,当矩形扩展时,分隔符会保持 80 度

    水平缩小超级视图时,矩形保持在 398,而垫片缩小到 10

    之后矩形继续缩小


这些极端情况可以简化为

案例 A - superview > 398+80+80(Spacers 固定为 80,矩形从 398 扩展) 案例 B - superview > 398+10+10(矩形固定在 398,间隔从 80 收缩到 10) 案例 C - superview

请注意数字是如何从一个案例跳到另一个案例的。垫片中Case ACase B之间有一个平滑的连接,在临界点从80 -> 80。从 Case BCase C 的矩形也是如此。自动布局使用的算法在处理关键点时总是会产生平滑的解决方案。


【讨论】:

以上是关于不等式的自动布局歧义的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局 beta 7 UIKIT 修复 xcode 11 中可滚动内容大小的歧义

IOS自动布局中位置属性约束方程的非恒等式

符号歧义和回购布局

解决 UIStackView 布局歧义

自动布局是拉伸图像,自动布局,ios

UGUI笔记5-自动布局