无法同时满足约束,将尝试通过打破约束来恢复
以下是我在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如何做到这一点:
- debugging视图层次结构 (不要这样推荐)
既然你知道在哪里find意想不到的约束(PBOUserWorkDayHeaderView),有一种方法可以做到这一点。 让我们findUIView
和NSLayoutConstraint
在红色的矩形。 由于我们知道他们在记忆中的身份证,所以很容易。
- 使用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器指向您的每个约束执行相同的操作:-)现在您决定如何处理这个问题。
-
打印它更好 (我真的推荐这种方式,这是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
- “Command + A”select所有的UILabels,UIImages等
- 单击编辑器 – >针>(select…)到Superview
- 再次单击编辑器 – >解决自动布局问题 – >添加缺less约束或重置为build议的约束。 这取决于你的情况。
这是我的经验和解决scheme。 我没有触及代码
- select视图(UILabel,UIImage等)
- 编辑器> Pin>(select…)到Superview
- 编辑器>解决自动布局问题>添加缺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)
因为这个约束是我的观点的技术上的兄弟约束。