我啥时候必须在 iOS 自动布局中使用优先级?
Posted
技术标签:
【中文标题】我啥时候必须在 iOS 自动布局中使用优先级?【英文标题】:When do I have to use Priority in iOS AutoLayout?我什么时候必须在 iOS 自动布局中使用优先级? 【发布时间】:2015-06-04 22:14:23 【问题描述】:使用 ios 自动布局,您将执行以下操作:
self.view.addConstraint(NSLayoutConstraint(item: label,
attribute: .Width,
relatedBy: .Equal,
toItem: self.view,
attribute: .Width,
multiplier: 0.3,
constant: 0))
您还可以为每个布局约束使用优先级。
我什么时候必须在 iOS 自动布局中使用优先级?
【问题讨论】:
【参考方案1】:你可以用它来近似条件逻辑。
例如,我有一个裁剪视图(想象一个面部轮廓的圆形切口)。如果图像是纵向的,我希望圆圈靠近顶部,但如果图像是横向的,就没有空间让它偏离中心,而且没有意义。
为了解决这两种情况,我首先设置了边界约束 - 覆盖应该始终在图像视图内(对边缘的 contants 使用 = 约束)。然后我有另一个较低优先级的约束,说理想情况下它会高于中心,但低于那个的后备约束,否则我希望它居中。最后两个约束会导致冲突,但布局引擎会选择最高优先级。在横向情况下,上述中心是不可能的,因此 AL 打破了这一点并留下了居中约束。
另一个例子——也是在下面的代码 sn-p 中的例子,是我希望我的叠加层使用尽可能多的空间,同时保持适当的纵横比。这意味着虽然我的外部约束是绝对的,但我将理想的裁剪框声明在边界处,因为我知道一次只能满足一组,但纵横比优先。然后,AL 会尽可能多地中断 - 每个方向都有两个,而其他两个则保持完整。没有这个,问题就会有很多可能的解决方案。
在我的实际代码中,我将它们捕获为一组约束。每个都由惰性实例变量创建:
self.addConstraints([
// absolute constraints
self.leftMarginConstraint,
self.rightMarginConstraint,
self.topMarginConstraint,
self.bottomMarginConstraint,
self.aspectRatioConstraint,
self.constrain(self.maskContainer, self, .CenterX, .Equal),
// hug the edges as much as possible, but only two of the four will be used
self.constrain(self.maskContainer, self, .Left, .Equal, priority:900),
self.constrain(self, self.maskContainer, .Right, .Equal, priority:900),
self.constrain(self.maskContainer, self, .Top, .Equal, priority:900),
self.constrain(self, self.maskContainer, .Bottom, .Equal, priority:900),
// try for above center, but accept vertically centered
self.constrain(self.maskContainer, self, .CenterY, .Equal, priority:800, multiplier:0.8),
self.constrain(self.maskContainer, self, .CenterY, .Equal, priority:500),
])
【讨论】:
我没有给你最后两个约束,你能解释一下它们是如何工作的吗? 也许你从你目前所了解的开始,我在上面的第三段中确实描述了它们。 这个解释没有意义。我不明白你的描述。【参考方案2】:在自动布局中,当两个约束和情节提要混淆哪个约束是正确的时,通常优先使用它。如果您设置的优先级高于它,则使用比第二个更高的优先级约束。
【讨论】:
以上是关于我啥时候必须在 iOS 自动布局中使用优先级?的主要内容,如果未能解决你的问题,请参考以下文章