Autolayout歧义与不平等

时间:2014-07-27 20:07:54

标签: ios cocoa user-interface interface-builder autolayout

我对Cocoa的Autolayout如何确定布局是否含糊不清感到困惑。这是一个简单的例子:

Layout

观察到的行为如下。绿色矩形左侧和右侧的垫片总是宽度相同。当您将超视图水平向外拉伸时,间隔物会在矩形扩展时粘到80。当水平缩小超视图时,矩形会粘到398,而间隔缩小到10,之后矩形继续缩小。在任何一点上,IB的布局都不明确。

但是,您会注意到水平布局几乎完全由不等式定义!从我所看到的,当矩形的宽度> 398,没有理由间隔物的宽度为80.它们的宽度可以是10到80,并且仍然满足每个水平不等式。这对我来说听起来很模糊,但IB显然不同意。

必须有一些我错过的隐含规则。请帮帮我!

1 个答案:

答案 0 :(得分:3)

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

  

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

因此要求

  

布局系统尽可能接近满足可选约束   必须严格满足优先级为1000的约束   在具有较低优先级的约束之前满足较高优先级约束

然而,正如你所注意到的那样     是什么原因导致间隔贪婪地扩展到80,而绿色矩形由于具有更高的优先级而最大扩展?

自动布局没有定义"尽可能关闭"和#34;在约束之前满足更高的修道院限制"以一种明确的方式。 Auto布局文档提到了这两个维度:优先级和贴近度;但是这些文件没有说明这些维度的优化是如何相互作用的。

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


让我们考虑你的角落案例

  
      
  1. 当水平向外拉伸超视图时,当矩形扩展时,间隔物会粘到80上

  2.   
  3. 当您水平收缩超级视图时,矩形会粘到398,而间隔符缩小到10

  4.   
  5. 之后矩形继续缩小

  6.   

这些角落案例可以简化为

  • 案例A - superview> 398 + 80 + 80(间隔物固定为80,矩形从398扩展)
  • 案例B - superview> 398 + 10 + 10(矩形固定在398,间隔从80到10收缩)
  • 案例C - superview< = 398 + 10 + 10(间隔符固定为10,矩形合约自398)

注意数字如何从一个案例跳到另一个案例。间隔器中的案例A 案例B 之间的连接顺畅,从80开始 - > 80在关键点。从案例B 案例C 的矩形也是如此。在处理关键点时,自动布局使用的算法总能产生平滑的解决方案。