无法同时满足约束,将尝试通过打破约束来恢复

以下是我在debugging区域收到的错误消息。 它运行良好,除了我收到这个错误,没有什么是错的。 这会阻止苹果接受应用程序? 我如何解决它?

2012-07-26 01:58:18.621 Rolo[33597:11303] 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:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>", "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>", "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>", "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>", "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>", "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>", "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>", "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>", "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>", "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>", "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> Break on objc_exception_throw to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

我会build议debugging,并find哪个约束是“你不想要的” 。 假设您有以下问题:

在这里输入图像说明

总是问题是如何find下面的约束和视图。

有两个解决scheme如何做到这一点:

  1. debugging视图层次结构 (不要这样推荐)

既然你知道在哪里find意想不到的约束(PBOUserWorkDayHeaderView),有一种方法可以做到这一点。 让我们findUIViewNSLayoutConstraint在红色的矩形。 由于我们知道他们在记忆中身份证,所以很容易。

  • 使用Debug View Hierarchy停止应用程序:

在这里输入图像说明

  • find适当的UIView:

在这里输入图像说明

  • 接下来是find我们关心的NSLayoutConstraint:

在这里输入图像说明

正如你所看到的,内存指针是一样的。 所以我们知道现在发生了什么。 另外你可以在视图层次结构中findNSLayoutConstraint 。 由于它在View中被选中,所以在Navigator中也被选中。

在这里输入图像说明

如果您需要,也可以使用地址指针在控制台上打印:

 (lldb) po 0x17dce920 <UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>> 

您可以对debugging器指向您的每个约束执行相同的操作:-)现在您决定如何处理这个问题。

  1. 打印它更好 (我真的推荐这种方式,这是Xcode 7)

    • 为您的视图中的每个约束设置唯一的标识符:

在这里输入图像说明

  • NSLayoutConstraint创build简单的扩展:

SWIFT

 extension NSLayoutConstraint { override public var description: String { let id = identifier ?? "" return "id: \(id), constant: \(constant)" //you may print whatever you want here } } 

Objective-C的

 @interface NSLayoutConstraint (Description) @end @implementation NSLayoutConstraint (Description) -(NSString *)description { return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant]; } @end 
  • 再次构build它,现在你有更多可读的输出:

在这里输入图像说明

  • 一旦你有了你的id你可以简单地在你的查找导航器中点击它:

在这里输入图像说明

  • 并迅速find它:

在这里输入图像说明

如何简单地修复这种情况?

  • 尝试将优先级更改为999以查看是否有损坏的约束

你遇到的问题是NSAutoresizingMaskLayoutConstraints不应该在那里。 这是弹簧和支柱的旧系统。 为了摆脱它,在你想约束的每个视图上运行这个方法:

 [view setTranslatesAutoresizingMaskIntoConstraints:NO]; 

要小心 ,不要在相同的方向和types上使用多个约束。

例如: 尾随垂直约束= 15,另一个大于= 10。

有时候,Xcode会创build一些你没有注意到的限制 。 你必须摆脱多余的约束 ,日志警告肯定会消失。

在这里输入图像说明

另外, 您可以直接从日志中 读取和检测一些某些原因:

NSLayoutConstraint:0xa338390 V:| – (15) – [UILabel:0xa331260](名称:'|':UILabel:0xa330270)>

这个我们可以把UILabel约束看作是问题,它是领先的垂直约束15pt长。

NSLayoutConstraint:0x859ab20 H 🙁 13) – | [UIView:0x85a8fb0] …

这将是后面的水平限制等。

我有这个问题,因为我的.xib文件使用自动布局。

在文件检查器中,第一个选项卡。 不解“使用Autolayout”解决了这个问题。

自动布局文件检查器

我遇到了很多这样的exception,我发现解决这些exception的最快速和最简单的方法就是在故事板源代码中查找的exception中find唯一的值。 这帮助我find引起问题的实际视图和约束(我在所有视图上使用了有意义的userLabel,这使得跟踪约束和视图变得更容易)。

所以,使用上面的例外,我会打开故事板作为xcode(或其他编辑器)中的“源代码”,并寻找我可以find的东西…

 <NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

..这看起来像UILabel上的垂直(V)约束的值(17)。

通过例外,我也发现

 <NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]> 

看起来像UILabel(0x72bf7c0)是靠近一个UIButton(0x886efe0)与一些垂直间距(8)..

对于我来说,在故事板源代码中find具体的视图(可能是通过最初search“17”的文本),或者至less有几个可能的候选者,这将是足够的。 从那里,我应该能够真正弄清楚故事板中的哪些视图,这将使识别问题变得更加容易(寻找与“尺寸限制”相冲突的“重复”locking或locking)。

我很难弄清楚是什么原因造成了这个错误。 这是一个更简单的方法来做到这一点。

我正在使用Xcode 6.1.1

  1. “Command + A”select所有的UILabels,UIImages等
  2. 单击编辑器 – >针>(select…)到Superview
  3. 再次单击编辑器 – >解决自动布局问题 – >添加缺less约束或重置为build议的约束。 这取决于你的情况。

这是我的经验和解决scheme。 我没有触及代码

  1. select视图(UILabel,UIImage等)
  2. 编辑器> Pin>(select…)到Superview
  3. 编辑器>解决自动布局问题>添加缺less约束

我已经按照每个search查询的SO问题和答案。 但他们都与具体的有关。

基本上,我的意思是在你写下一个格式(可能是简单的格式)之前,它会给你一个警告。

从iOS 8.0默认的视图是大小类。 即使你禁用大小类,它仍然会包含一些自动布局约束。

所以如果你打算通过代码使用VFL设置约束。 那么你必须照顾下面一行。

 // Remove constraints if any. [self.view removeConstraints:self.view.constraints]; 

我在search了很多,但解决scheme是在苹果示例代码 。

因此,您必须在计划添加新约束之前删除默认约束。

对我来说,这个问题的主要原因是我忘了在AutoLayout编辑器中取消选中AutoLayout 。 实际上,我在代码中做了很多XIB的调整。

  for(UIView *view in [self.view subviews]) { [view setTranslatesAutoresizingMaskIntoConstraints:NO]; } 

这帮助我了解导致问题的观点。

使用swift这个代码

 view.translatesAutoresizingMaskIntoConstraints = false 

有一件事要注意(至less这让我绊倒了),是我从错误的观点中去除了约束。 我试图去除的约束不是我的观点的孩子约束,所以当我这样做

 myView.removeConstraint(theConstraint) 

这实际上并没有删除任何东西,因为我需要打电话

 myView.superView.removeConstraint(theConstraint) 

因为这个约束是我的观点的技术上的兄弟约束。