我啥时候必须在 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 自动布局中使用优先级?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 视图高度和自动布局

iOS 自动布局小结

我啥时候使用中心和自动保证金? CSS

如何在 ios 中使用自动布局更改滚动视图内容大小

iOS:在自动布局下更改 UITableView 高度

ios 6:使用自动布局约束垂直居中 UILabel