确定具有不同优先级的两个布局约束中的哪一个确定它们影响的维度/锚点的值

时间:2018-05-21 19:32:12

标签: ios swift uikit nslayoutconstraint

假设我有两个不同优先级的NSLayoutConstraints会影响某些视图的高度( middleView )。

下面,middleView固定在topView的底部,高度为500,除非bottomView的顶部会强制它更小。

// topView and bottomView have well-defined constraints, and middleView has well defined x-axis/width constraints not shown here
middleView.topAnchor.constraint(isEqual: topView.bottomAnchor).isActive = true

let heightConstraint = middleView.heightAnchor.constraint(isEqualToConstant: 500)
heightConstraint.priority = UILayoutPriority.high
heightConstraint.isActive = true

let bottomConstraint = middView.bottomAnchor.constraint(isLessThanOrEqualTo: bottomView.topAnchor, constant: someMargin)
bottomConstraint.isActive = true // priority is .required by default

除了检查我的视图高度是否为500之外,还有其他方法可以确定这两个约束中的哪一个“有效”吗?假设bottomView处于这样的位置:如果强制middleView的高度小于500,则heightConstraint是否有一些属性来确定它被一个优先级高于其自身的约束绕过?

我想使用heightConstraint作为某种“开关”,在满足时触发某些东西。

2 个答案:

答案 0 :(得分:3)

这是无法回答的,因为两者可能会产生一些影响。即使不能满足不需要的约束,它也会影响布局。来自Auto Layout Guide

  

即使无法满足​​可选约束,它仍然可以影响布局。如果在跳过约束后布局中存在任何歧义,系统将选择最接近约束的解决方案。通过这种方式,不满意的可选约束可以作为向他们提供观点的力量。

自动布局使用约束求解器计算其值。 (我相信它仍在使用Cassowary,或者接近它的东西。)约束求解器基本上是线性代数引擎。你将一堆线性方程式放入一个矩阵中,然后尝试用一些向量来解决它,使一切变得“最好”。这种方法的一个折衷是一切都在一起解决,而且为什么选择了一个特定的值并不总是显而易见的。这就是它的原因,因为它是整个解决方案的一部分。 (通过这种方式,CSP系统与机器学习系统非常相似。它们提供的答案是“正确的”,但是如果逻辑可以的话,它们并不总是按照分支的方式逐步提供它们。这就是为什么他们调试起来非常具有挑战性。)

对于你的问题,我会根据你真正关心的事情做出你的逻辑。 “被解雇的约束”绝不是你关心的实际事情(特别是因为约束不会“解雇”)。你通常关心结果中的某些东西(比如最后的高度),所以你应该检查一下。

答案 1 :(得分:0)

看起来不可能。替代方案是将所讨论的维度/锚定常数与可能的值进行比较。