"无法同时满足约束条件"禁用AutoLayout时

时间:2015-02-20 13:48:57

标签: ios objective-c xcode autolayout

我在界面构建器中为特定视图禁用了自动布局: Interface builder

但是当我为xib文件加载ViewController时,我在控制台中出现了这个错误:

  

无法同时满足约束条件。

     

以下列表中的至少一个约束可能是您不想要的约束。试试这个:(1)看看每个约束,并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)

我正在使用此视图中的框架,当我在Interface Builder中禁用它时,我通常不会收到任何自动布局错误。这是似乎破坏的限制因素:

(
    "<NSLayoutConstraint:0x170f5cd0 V:[UIView:0x1709e560]-(0)-[UITableView:0x162e2200]>",
    "<NSAutoresizingMaskLayoutConstraint:0x17185130 h=--& v=--& UIView:0x1709e560.midY == + 48>",
    "<NSAutoresizingMaskLayoutConstraint:0x157e29a0 h=--& v=--& V:[UIView:0x1709e560(96)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x171c2670 h=--& v=--& TableHeaderView:0x1705d1c0.midY == + 72.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x171cb510 h=--& v=--& V:[TableHeaderView:0x1705d1c0(145)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x1573fca0 h=-&- v=-&- UITableView:0x162e2200.midY == UIView:0x17505080.midY + 72.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x1573fcd0 h=-&- v=-&- UITableView:0x162e2200.height == UIView:0x17505080.height - 145>",
    "<NSAutoresizingMaskLayoutConstraint:0x171e4450 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x17505080]   (Names: '|':UIViewControllerWrapperView:0x17034d00 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x16c9ad30 V:[UIView:0x16cc2a00]-(0)-[UITableView:0x15249400]>

如果我错了,请纠正我,但我只是认为如果启用了自动布局,我会收到此错误?

对我而言,似乎我认为我已经在UIViewUITableView之间设置了约束,但我还是没有!在Interface Builder中禁用了自动布局,我没有在代码中设置任何约束。

我尝试将translatesAutoresizingMaskIntoConstraints设置为NO,但在执行此操作时我的框架不受尊重。

在我看来,就像视图正在使用自动布局一样。我试图删除该文件并再次构建它,但我仍然得到同样的错误。

为什么在xib文件中禁用自动布局时会出现此错误?

修改

事实证明,当我在寻找约束时,我犯了一个错误。我在代码中找到了这一行:

NSDictionary* views = @{@"searchHeaderView": self.searchHeader.view, @"tableView": self.tableView};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[searchHeaderView]-(==0)-[tableView]" options:0 metrics:nil views:views]];

我认为这解释了:-P

2 个答案:

答案 0 :(得分:3)

有些奇怪的事情正在发生,因为如果你仔细观察,'will break'约束的内存地址和附加到它的视图不在数组中,所以这些是不同的实例。

无论如何,不​​受欢迎的自动布局行为与您的怀疑是一致的:如果一个约束被添加到视图层次结构中,则AutoLayout“重新打开”至少对于它的那一部分而言,您会得到一堆autoresizingmask约束。

所以这是一个调试问题。您可以在调试器中使用的一些命令方法:

po [[UIWindow keyWindow] recursiveDescription]

使用UIView描述(包括框架)为您提供视图层次结构的完整大纲。

po [[UIWindow keyWindow] _autolayoutTrace]

这是私有API,但这不是开发期间的问题,尤其是不调试。如果您遵循建议并在UIViewAlertForUnsatisfiableConstraints(断点导航器,底部)添加符号断点,这实际上效果最佳。祝你好运。

答案 1 :(得分:0)

我很确定如果您不想使用AutoLayout,则需要将translatesAutoresizingMaskIntoConstraints设置为YES而不是NO

然后确保为您创建约束,这些约束反映了界面构建器中绘制的位置,而无需添加约束。也许你有一些约束与它认为需要自动生成的那些冲突?如果你能找到任何约束,我会删除任何限制。如果没有要删除的,你可以发布它说是冲突的列表吗?