无法同时满足约束条件,将尝试通过打破约束条件进行恢复


145

以下是我在调试区域中收到的错误消息。它运行正常,除了我收到此错误外,没有其他问题。这会阻止苹果接受该应用程序吗?我如何解决它?

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.

1
此错误只会在Xcode 4.5中发生,因此您无论如何都无法将其提交到App Store(直到发布)
borrrden 2012年

那么,没有错吗?并可以使用其他版本的xcode来提交到应用商店吗?
约翰尼·考克斯

1
是的,有问题,但是无关紧要,因为它与iOS的功能有关,而该功能在公共Xcode版本中尚不可用。如果使用4.4进行编译,则可以使用该版本(今天发布)发布它。
borrrden

我在Xcode 4.4中收到针对OS X应用程序的错误消息。我不明白
史蒂夫·麦克劳德

@BartłomiejSemańczyk您能否通过任何机会加入会议室:chat.stackoverflow.com/rooms/92522/autolayout-and-ios?对不起,它是随机的,但是希望您对与自动布局相关的问题提供建议,谢谢!
cheznead 2015年

Answers:


275

我建议调试并找出哪个约束是“您不想要的约束。假设您有以下问题:

在此处输入图片说明

始终存在的问题是如何找到以下约束和视图。

有两种解决方法:

  1. 调试视图层次结构 (不建议这样)

因为您知道在哪里可以找到意外约束(PBOUserWorkDayHeaderView),所以有一种方法可以很好地做到这一点。让我们找到UIViewNSLayoutConstraint在红色矩形中。由于我们知道它们在内存中ID,因此非常容易。

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

在此处输入图片说明

  • 找到合适的UIView:

在此处输入图片说明

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

在此处输入图片说明

如您所见,内存指针是相同的。所以我们知道现在发生了什么。此外,您可以NSLayoutConstraint在视图层次结构中找到。由于在“视图”中选择了它,因此它也在“导航器”中选择了。

在此处输入图片说明

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

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

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

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

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

在此处输入图片说明

  • 为以下内容创建简单的扩展名NSLayoutConstraint

SWIFT

extension NSLayoutConstraint {

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

目标C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • 再次构建它,现在您将获得更具可读性的输出:

在此处输入图片说明

  • 一旦找到,您id可以在“ 查找导航器”中简单点击它:

在此处输入图片说明

  • 并迅速找到它:

在此处输入图片说明

如何简单解决这种情况?

  • 尝试改变优先级,以999断开的约束。

这只是解决了我的错误...非常感谢。您将如何实现目标c?添加类别?
cheznead

Thx作为解决方案,但是我可以在目标c中使用扩展吗?
dev.nikolaz 2015年

该标识符是否与UIViews上以编程方式可用的accessibilityIdentifier相同?如果没有,如何以编程方式设置标识符?
阿鲁纳布·戴斯(Arunabh Das)

@Das,不一样。阅读这个答案
巴特洛梅耶Semańczyk

3
我喜欢
第二种

108

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

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

5
将setTranslatesAutoresizingMaskIntoConstraints设置为NO时,根本不显示视图的一些原因是什么?
topwik

1
例如,我创建一个SSBadgeView(UIView),将imageView子视图添加到SSBadgeView,然后将SSBAdgeView作为子视图添加到UIReuseableView。我在SSBadgeView上添加了一些约束,并在SSBadgeView上设置了setTranslatesAutoresizingMaskIntoConstraints:NO。SSBadgeView的图像subView按预期方式布置,但是看不到图像的SSBadgeView父级。
13年

1
您忘记了在子视图中禁用TranslatesAutoresizingMaskIntoConstraints
Softlion 2013年

当我设置此属性drive.google.com/file/d/0BxuYs8WHXCF7bV9ndHFrQ0dMYVE/ 时,就会发生这种情况。我使用的是以下代码行:对于(UIView * self.contentView.subviews中的view){[view setTranslatesAutoresizingMaskIntoConstraints:NO]; }以前它看起来像:drive.google.com/file/d/0BxuYs8WHXCF7OWlvZGQwN3FlbzQ/… 虽然有效,但我必须说。
rptwsthi

28

请注意,不要在同一方向和类型上使用多个约束。

例如: 尾随的垂直约束为15,而另一个约束为> = 10。

有时,Xcode会创建一些您没有注意到的约束。您必须摆脱冗余约束,日志警告肯定会消失。

在此处输入图片说明

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

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

我们可以将其视为UILabel约束中的问题,它导致垂直约束长15pt。

NSLayoutConstraint:0x859ab20 H :-( 13)-| [UIView:0x85a8fb0] ...

这将是尾随水平约束等。


6

我抛出了很多这样的异常,我找到解决它们的最快,最简单的方法是在异常中找到唯一的值,然后在情节提要源代码中搜索这些异常。这帮助我找到了导致问题的实际视图和约束(我在所有视图上使用了有意义的userLabel,这使得跟踪约束和视图变得容易得多)...

因此,使用上述例外,我将在xcode(或其他编辑器)中以“源代码”的形式打开情节提要,并寻找可以找到的东西...

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

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

查看例外情况,我也发现

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

看起来UILabel(0x72bf7c0)接近于UIButton(0x886efe0),并具有一定的垂直间距(8)。

希望这足以让我在情节提要源代码中找到特定的视图(可能是通过最初在文本中搜索“ 17”)或至少一些可能的候选者。从那里,我应该能够真正找出情节提要中的哪些视图,这将使查找问题变得更加容易(查找“重复的”固定或固定与大小限制冲突的位置)。


“我使用有意义的userLabels” –在此上下文中,userLabel是什么?(例如如何设置它们)
条纹

身份检查器的“文档”部分中是一个字段“ Label” ..,该字段被转换为故事板源代码中的“ userLabel”值。
C詹姆斯

您也可以通过在左侧的“概述”面板中单击选定的视图来进行设置(有点像在finder中重命名文件)
C James

1
关于解决可怕的“无法同时满足约束条件”,这可能是我读过的最好的东西。痛。我发现此时显示的对象“将尝试通过打破约束<NSLayoutConstraint:进行恢复”通常是罪魁祸首,正如C James所说,可能是高度约束或宽度约束与固定约束发生冲突。我发现很难删除高度,但是由于约束条件正确,因此可以从其他约束条件中收集高度。添加高度限制只会混淆自动布局,这就是我现在要寻找的。
latenitecoder 2014年

6

我很难弄清楚是什么约束导致了此错误。这是一种更简单的方法。

我正在使用Xcode 6.1.1

  1. “ Command + A”选择所有UILabel,UIImages等。
  2. 单击编辑器->固定>(选择...)以查看
  3. 再次单击编辑器->解决自动布局问题->添加缺少的约束或重置为建议的约束。这取决于您的情况。

5

我遇到了这个问题,因为我的.xib文件正在使用自动版式。

在文件检查器中,第一个选项卡。取消勾选“使用自动布局”即可解决该问题。

自动布局文件检查器


所以我做到了,它解决了问题,但是我在屏幕顶部(用作导航栏)的“ UIImageView”移到了屏幕底部。你知道为什么会这样吗?
Dietbacon 2013年

1
自动布局使用约束来控制对象的布局。由于您只是禁用了自动布局,因此这些约束很可能已经消失,因此您的位置UIImageView已更改。您必须通过编程或通过Interface Builder重新设置该位置。
斯特凡·布鲁克特

5

这是我的经验和解决方案。我没碰过代码

  1. 选择视图(UILabel,UIImage等)
  2. 编辑器>固定>(选择...)进行超级查看
  3. 编辑器>解决自动布局问题>添加缺少的约束

4

快速使用此代码

view.translatesAutoresizingMaskIntoConstraints = false

1
这是对带有客观C标签的问题的快速解答。
Tobi Nary

2
@SmokeDispenser无论如何,我已经提到这是一个快速代码。它为我工作。swift / objective它具有常见的可可触摸SDK。
Arun Kumar P

2

我已经跟踪了每个搜索查询的问题和答案。但是它们都与特定的一个有关。

从根本上讲,我的意思是在您写下一种格式(可能是一种简单的格式)之前,它会给您警告。

默认情况下,从iOS 8.0开始,视图为大小类。即使禁用大小类,它仍将包含一些自动布局约束。

因此,如果您打算使用VFL通过代码设置约束。然后,您必须注意以下一行。

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

我在SO中进行了大量搜索,但是解决方案在于Apple Sample Code

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


1

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


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

这有助于我捕捉引起问题的观点。


1

在我的情况下,上述答案都没有帮助。我正在运行XCode 10.1,并在模拟器上针对“ iPad(第5代)”测试了我的应用。该模拟器正在运行iOS 12.1。

我的情节提要中有一个简单的根视图,带有两个UITextField子视图。情节提要中根本没有使用任何约束。而且我在应用程序或情节提要中没有UIButtonBarView对象。

当应用启动并显示根视图时,不会打印任何消息。旋转模拟设备时不显示。

但是在模拟器中,当我单击文本字段之一时,键盘扩展名从屏幕底部出现,尽管不是完整的键盘,但这似乎从未出现在模拟器中。但是在终端上打印了以下内容:

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:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

在我看来,这一切显然与我的应用程序无关,与苹果如何创建自己的键盘视图(即使我的小扩展程序宣布要与之结合)也没有关系。

因此问题仍然存在,作为应用程序开发人员,我是否有责任做某件事(假设这是一堆值得关注的东西),还是苹果自己的问题/错误?

FWIW,在模拟较新的iPad模型(例如iPad Pro 12.9英寸(第3代))时,不会出现此约束问题消息。但是,在模拟9.7英寸iPad Pro时,确实会显示该消息。所有人都声称他们运行的是iOS 12.1。


1

我碰到同样的错误,但仅在特定的视图上,当我触摸第一个文本字段,然后触摸下一个文本字段时。

我正在使用iOS 13.4的SwiftUI编写

 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. 
    (
        "<NSLayoutConstraint:0x2809b6760 'assistantHeight' TUISystemInputAssistantView:0x105710da0.height == 44   (active)>",
        "<NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>",
        "<NSLayoutConstraint:0x2809cccd0 'assistantView.top' V:|-(0)-[TUISystemInputAssistantView:0x105710da0]   (active, names: '|':UIInputSetHostView:0x105215010 )>",
        "<NSLayoutConstraint:0x2809ca300 'inputView.top' V:|-(0)-[_UIKBCompatInputView:0x10525ae10]   (active, names: '|':UIInputSetHostView:0x105215010 )>"
    )

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

0

对于xib中的viewCircle,我也遇到了打破日志约束的相同问题。我几乎尝试了上面列出的所有内容,但对我没有任何帮助。然后我尝试更改在日志中打破的高度约束的优先级(通过在xib上添加约束的标识符来确认),在此处输入图像描述


-1

需要注意的一件事(至少这使我绊倒了)是我从错误的观点中删除了约束。我试图删除的约束不是我观点的子约束,所以当我这样做时

myView.removeConstraint(theConstraint)

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

myView.superView.removeConstraint(theConstraint)

因为该约束在技术上是我观点的同级约束。


-4

迅捷4

我只是在viewDidLoad中添加了这一行,并与我一起正常工作。

view.removeConstraints(view.constraints)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.