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

下面是我在调试区域收到的错误消息。它运行良好,没有任何错误,除了我收到这个错误。这会阻止苹果接受这个应用程序吗?我该怎么补救?

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.
152594 次浏览

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

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

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

在文件检查器中,第一个标签。取消勾选“使用自动布局”解决了这个问题。

autolayout file inspector

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

例如: 拖尾的垂直约束 = 15,另一个是 > = 10。

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

enter image description here

另外,你可以读取和检测有一定的原因,直接 记录在案:

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

这可以理解为 UILabel 约束中的问题,它导致垂直约束长度为15pt。

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

这将是尾随水平约束等。

以下是我的经验和解决方案。 我没碰密码

  1. 选择视图(UILabel、 UIImage 等)
  2. 编辑 > 别针 > (选择...)到 Superview
  3. 编辑器 > 解决自动布局问题 > 添加缺少的约束

我抛出了相当多的这些异常,我发现解决它们的最快和最简单的方法是在异常中找到唯一的值,然后在故事板源代码中搜索这些值。这有助于我找到导致问题的实际视图和约束(我对所有视图使用有意义的 userLabels,这使得跟踪约束和视图变得更加容易) ..。

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

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

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

通过查看异常,我还发现

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

看起来 UILabel (0x72bf7c0)接近于一个带有一些垂直间距(8)的 UIButton (0x886efe0)。

希望这样就足够我在故事板源代码中找到特定的视图(可能是通过在文本中搜索“17”开始) ,或者至少找到一些可能的候选者。从那里我应该能够实际找出哪些视图这些是在故事板,这将使它更容易确定问题(寻找“重复”钉或钉与大小约束冲突)。

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

我已经按照 SO 的问题和答案从每个搜索查询。但他们都与具体的一个相关。

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

默认情况下,iOS 8.0中的视图是 size 类。即使您禁用 size 类,它仍然会包含一些自动布局约束。

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

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

我在 SO 中搜索了很多,但是解决方案是在 苹果样本代码中。

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

我花了很长时间才弄清楚是什么约束导致了这个错误。这里有一个更简单的方法。

我使用的是 Xcode 6.1.1

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

我建议调试并找出哪个约束是 “你不想要的人”:

enter image description here

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

如何做到这一点有两种解决方案:

  1. 调试视图层次结构 < em > (不推荐使用此方法)

因为您知道在哪里可以找到意想不到的约束(PBOUserWorkDayHeaderView) ,所以有一种方法可以做得相当好。让我们找到红色矩形中的 UIViewNSLayoutConstraint。因为我们知道他们的 记忆中的身份是很容易的。

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

enter image description here

  • 找到合适的 UIView:

enter image description here

  • 下一步是找到我们关心的 NSLayoutConstraint:

enter image description here

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

enter image description here

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

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

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

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

    • 为你认为的每个约束设置唯一标识符:

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以打破约束。
 for(UIView *view in [self.view subviews]) {
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

这帮助我抓住了引起问题的观点。

使用 Swift 这个代码

view.translatesAutoresizingMaskIntoConstraints = false

需要注意的一件事(至少这让我犯了错误)是,我正在从错误的视图中移除约束。我试图消除的约束不是我视图的子约束,所以当我这样做时

myView.removeConstraint(theConstraint)

实际上并不是因为我需要打电话

myView.superView.removeConstraint(theConstraint)

因为从技术上讲,这种约束是我观点的兄弟姐妹约束。

迅猛4

我只需要在 viewDidLoad 中添加这一行,就可以很好地工作了。

view.removeConstraints(view.constraints)

以上所有的回答对我的情况都没有帮助。我正在运行 XCode 10.1,并在模拟器上测试我的应用程序是否是“ iPad (第五代)”。模拟器运行 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英寸(第三代)。但在模拟 iPad Pro 9.7英寸时,这个信息确实显示了出来。”。都声称他们运行的是 iOS 12.1。

对于 xib 中的 viewCircle,我也遇到了同样的问题,即打破日志中的约束。我几乎尝试了上面列出的所有方法,但都不管用。 然后我尝试改变 Height 约束的优先级,它在日志中中断(通过在 xib 上添加约束的标识符来确认) < a href = “ https://i.stack.imgur.com/8Q8Gl.png”rel = “ nofollow norefrer”> 在这里输入图像描述

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

我正在为 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.

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