【问题标题】:"Unable to simultaneously satisfy constraints" when AutoLayout is disabled禁用自动布局时“无法同时满足约束”
【发布时间】:2015-02-23 16:28:38
【问题描述】:

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

但是当我为 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]>

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

对我来说,它似乎认为我在UIView 和UITableView 之间设置了一个约束,但我没有!自动布局在 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

【问题讨论】:

  • 如果视图层次结构中的 any 视图有约束,则启用自动布局。如果启用了自动布局,XIB 中的 springs'n'struts 将转换为约束(NSAutoresizingMaskLayoutConstraint 类型)。
  • 另外,我怀疑调试器控制台中有更多输出。如果有,请编辑您的问题以包含所有内容。

标签: ios objective-c xcode autolayout


【解决方案1】:

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

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

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

po [[UIWindow keyWindow] recursiveDescription]

为您提供视图层次结构的完整轮廓,以及 UIView 描述,其中包括框架。

po [[UIWindow keyWindow] _autolayoutTrace]

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

【讨论】:

  • 感谢您的帮助。事实证明,我确实自己创建了约束。抱歉:-/ 但是为_autolayoutTrace +1。
  • @ThomasClemensen 所以我的陈述“这是一个调试问题”是正确的,就像“......行为与你的怀疑一致。如果添加一个约束......”,你说你感谢提到的调试工具之一。似乎您可以将其标记为已接受。创建您自己的答案来接受只是为了提供添加更多约束的确切代码行——您特别说“我没有!” -- 对使用您提供的信息认真看待您的问题的人不是很有礼貌。
  • 我实际上试图删除这个问题,因为我提供了错误的信息,没有人可以将它用于任何事情。当我试图删除它时,StackOverflow 告诉我这是一个非常糟糕的主意。不过既然你哭了,我就给你修好了。
  • 其实我认为这是一个不错的问题,如何确定是什么导致了这个问题(而不是对自动布局的误解)就是答案。我正在尝试建立统计数据,所以我很感谢你接受它。很多时候,自动布局是一个雷区,祝你好运。
【解决方案2】:

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

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

【讨论】:

  • 它可能是设备/模拟器上的剩余布局资源。我之前遇到过布局问题,只能通过卸载应用程序然后运行它来解决。值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多