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

时间:2012-07-26 07:04:35

标签: ios objective-c debugging nslayoutconstraint

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

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.

17 个答案:

答案 0 :(得分:246)

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

enter image description here

问题是如何找到以下约束和视图。

有两种解决方法:

  1. 调试视图等级 (不建议这样做)
  2. 由于您知道在哪里可以找到意外的约束(PBOUserWorkDayHeaderView),因此有一种方法可以很好地完成此操作。让我们在红色矩形中找到UIViewNSLayoutConstraint。由于我们知道他们在内存中 id ,因此很容易。

    • 使用调试视图层次结构停止应用:

    enter image description here

    • 找到合适的UIView:

    enter image description here

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

    enter image description here

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

    enter image description here

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

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

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

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

      • 为视图中的每个约束设置唯一标识符:
    2. enter image description here

      • 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
      
      • 再次构建它,现在您有更多可读输出:

      enter image description here

      • 获得id后,您可以在查找导航器中轻松点击它:

      enter image description here

      • 并迅速找到它:

      enter image description here

      如何简单地修复案例?

      • 尝试将优先级更改为999以获取损坏的约束。

答案 1 :(得分:105)

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

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

答案 2 :(得分:28)

小心,不要在同一方向和类型中使用多个约束。

例如: 尾随的垂直约束= 15,另一个是&gt; = 10.

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

enter image description here

另外,您可以阅读并检测某些原因,直接来自日志

  

NSLayoutConstraint:0xa338390 V:| - (15) - [UILabel:0xa331260](姓名:   '|':UILabel:0xa330270)&gt;

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

  

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

这将落后于水平约束等。

答案 3 :(得分:6)

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

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

autolayout file inspector

答案 4 :(得分:6)

我很难搞清楚导致此错误的约束条件。这是一种更简单的方法。

我正在使用Xcode 6.1.1

  1. “Command + A”选择所有UILabels,UIImages等。
  2. 点击编辑器 - &gt; Pin&gt; (选择......)到Superview
  3. 再次点击编辑器 - &gt;解决自动布局问题 - &gt;添加缺失约束或重置为建议的约束。这取决于你的情况。

答案 5 :(得分:6)

我抛出了很多这样的异常,我发现解决它们的最快和最简单的方法是在例外中找到唯一值,然后我在storyboard源代码中搜索。这有助于我找到导致问题的实际视图和约束(我在所有视图上使用有意义的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”),或者至少是一些可能的候选人。从那里我应该能够真正弄清楚它们在故事板中的哪些视图,这将使识别问题变得容易得多(寻找“重复”固定或固定与大小限制冲突)。

答案 6 :(得分:4)

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

  1. 选择视图(UILabel,UIImage等)
  2. 编辑器&gt; Pin&gt; (选择......)到Superview
  3. 编辑器&gt;解决自动布局问题&gt;添加缺失约束

答案 7 :(得分:4)

使用swift这段代码

view.translatesAutoresizingMaskIntoConstraints = false

答案 8 :(得分:2)

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

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

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

因此,如果您计划使用VFL通过代码设置约束。那你必须照顾下面一行。

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

我在SO中搜索了很多,但解决方案在于Apple Sample Code

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

这有助于我抓住导致问题的观点。

答案 11 :(得分:1)

迅捷4

我只是将这一行添加到viewDidLoad中,并且可以正常工作。

view.removeConstraints(view.constraints)

答案 12 :(得分: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.

答案 13 :(得分:0)

在我的情况下,上述任何答案均无用。我正在运行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模型(例如12.9英寸iPad Pro(第3代))时,不会出现此约束问题消息。但是,当模拟9.7英寸iPad Pro时,该消息确实显示。”所有声称它们正在运行iOS 12.1的人。

答案 14 :(得分:0)

对于xib中的viewCircle,我也遇到了打破日志约束的相同问题。我几乎尝试了上面列出的所有内容,但没有任何工作适合我。 然后,我尝试更改在日志中打破的Height约束的优先级(通过在xib上添加约束的标识符来确认)enter image description here

答案 15 :(得分:0)

基本上,您只需要从关联的视图中删除该约束即可。例如,如果高度限制发出警告,则将其从视图中删除;它不会影响视图。

答案 16 :(得分:-1)

要注意的一件事(至少让我绊倒)是我从错误的视角中删除了约束。我试图删除的约束不是我视图的子约束,所以当我做

myView.removeConstraint(theConstraint)

它实际上并没有删除任何内容,因为我需要调用

myView.superView.removeConstraint(theConstraint)

因为约束在技术上是我视角的兄弟约束。