降低约束优先级究竟做了什么?

时间:2017-03-30 21:22:55

标签: ios swift autolayout nslayoutconstraint

我正在另一个视图中构建一个可变大小的表视图。表视图不应滚动,因此我以编程方式确定其内容大小并调整高度约束,以便表视图始终适合其内容。

我遇到的问题是关于约束破坏的警告:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSAutoresizingMaskLayoutConstraint:0x170498b00 h=--& v=--& UIView:0x1024f2c90.height == 322   (active)>",
"<NSLayoutConstraint:0x17428d660 UITableView:0x103152400.height == 322   (active)>",
"<NSLayoutConstraint:0x174482da0 V:[UITableView:0x103152400]-(27)-|   (active, names: '|':UIView:0x1024f2c90 )>",
"<NSLayoutConstraint:0x17429da10 V:|-(16)-[UITableView:0x103152400]   (active, names: '|':UIView:0x1024f2c90 )>"
)

要解决这个问题,我尝试了两件事:

  1. 设置translatesAutoresizingMaskIntoConstraints = false。这会导致一切都与表格视图混在一起。
  2. 将可调高度约束的优先级降低到999.
  3. Point 2解决了我的问题,我可以使用优先级较低的约束来调整视图的高度。但是,我不明白为什么会这样。

    那么,Auto Layout如何解释约束的优先级?我希望NSAutoresizingMaskLayoutConstraint能够接管较低优先级的约束并使其无法使用约束来调整视图大小。

2 个答案:

答案 0 :(得分:0)

由于您在运行时设置高度,因此我会在运行时不需要的IB中选择高度/垂直约束,并转动“占位符”&#39;对于在构建时删除的约束&#39;,这应删除您的警告。

优先级设置确定何时存在冲突约束,将使用哪一个。

答案 1 :(得分:0)

回答标题中的问题:降低约束的优先级会告诉自动布局约束不如具有更高优先级的所有约束重要。

这意味着如果两个约束冲突,autolayout将使用具有最高优先级的约束而忽略另一个。

如果两个具有相同优先级的必需约束冲突,则会出现类似您所描述的错误消息。