无法同时满足约束 - Swift

Posted

技术标签:

【中文标题】无法同时满足约束 - Swift【英文标题】:Unable to simultaneously satisfy constraints - Swift 【发布时间】:2014-10-20 07:19:36 【问题描述】:

总结: 我刚刚完成了自动布局,当我运行它时,它们都被挤在一起了。然后我查看命令提示符,它说上面的错误。我试过用谷歌搜索它,但它只显示了 Obj-C 的解决方案,我正在用 Swift 做。我该如何解决这个自动布局问题?

错误:

2014-10-20 00:07:41.102 Fraction Calculator[74247:6698760] 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) 
(
    "<NSLayoutConstraint:0x7c440f10 V:[UIButton:0x7c440db0'Divide It!'(30)]>",
    "<NSLayoutConstraint:0x7af7bdb0 V:[UIImageView:0x7af7bae0(8)]>",
    "<NSLayoutConstraint:0x7ae928b0 V:[UITextField:0x7ae952d0(30)]>",
    "<NSLayoutConstraint:0x7ae97110 V:[UITextField:0x7ae96f70(30)]>",
    "<NSLayoutConstraint:0x7ae97eb0 V:[UILabel:0x7ae97d70'Enter Your Fraction To Be...'(48)]>",
    "<NSLayoutConstraint:0x7ae99cd0 V:[_UILayoutGuide:0x7ae990c0]-(0)-[UILabel:0x7ae97d70'Enter Your Fraction To Be...']>",
    "<NSLayoutConstraint:0x7ae9a000 V:[UILabel:0x7ae97d70'Enter Your Fraction To Be...']-(41)-[UITextField:0x7ae96f70]>",
    "<NSLayoutConstraint:0x7ae9a090 V:[UITextField:0x7ae96f70]-(14)-[UIImageView:0x7af7bae0]>",
    "<NSLayoutConstraint:0x7ae9a150 V:[UIImageView:0x7af7bae0]-(13)-[UITextField:0x7ae952d0]>",
    "<NSLayoutConstraint:0x7ae9a270 V:[UITextField:0x7ae952d0]-(59)-[UIButton:0x7c440db0'Divide It!']>",
    "<NSLayoutConstraint:0x7ae9a2a0 V:[UIButton:0x7c440db0'Divide It!']-(50)-[UILabel:0x7ae98df0]>",
    "<NSLayoutConstraint:0x7ae9a300 V:[UILabel:0x7ae98df0]-(166)-[_UILayoutGuide:0x7ae99680]>",
    "<_UILayoutSupportConstraint:0x7c441e80 V:[_UILayoutGuide:0x7ae990c0(20)]>",
    "<_UILayoutSupportConstraint:0x7c441770 V:|-(0)-[_UILayoutGuide:0x7ae990c0]   (Names: '|':UIView:0x7af7abc0 )>",
    "<_UILayoutSupportConstraint:0x7c443610 V:[_UILayoutGuide:0x7ae99680(0)]>",
    "<_UILayoutSupportConstraint:0x7c4429d0 _UILayoutGuide:0x7ae99680.bottom == UIView:0x7af7abc0.bottom>",
    "<NSLayoutConstraint:0x7c44acf0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7af7abc0(480)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7ae97eb0 V:[UILabel:0x7ae97d70'Enter Your Fraction To Be...'(48)]>

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

我的约束图像 https://www.dropbox.com/s/1l3ys9k7bdr8qrk/Screenshot%202014-10-20%2021.08.47.png?dl=0 我的 iPhone 4 预览图片 https://www.dropbox.com/s/7uoulzppalex2r8/Screenshot%202014-10-20%2021.09.48.png?dl=0 模拟器中的 iPhone 4 图像 https://www.dropbox.com/s/c1qedgoytcnetri/ios%20Simulator%20Screen%20Shot%20Oct%2020%2C%202014%2C%209.10.03%20PM.png?dl=0

如果你们有问题或需要澄清,请在下方评论

【问题讨论】:

如果您找到的解决方案在 Objective C 中会有什么不同?它是相同的 API,因此您可以在 Swift 中轻松地重写它们。 以防万一可能有同样问题的人,我想分享一个链接,指向可能的和最有可能的最佳解决方案。 https://***.com/a/30096600/11530680 选择最多的解决方案教你如何阅读错误信息。希望这对您有所帮助。 【参考方案1】:

仅通过查看您发布的错误来跟踪哪个是不良约束会有点困难。但是我可以给出一般规则或在使用自动布局或一般约束时要记住的事情,

更喜欢在 XIB/Storyboards 中设置约束。当你设置它们时,它会告诉你到底哪里出错了。除非有特殊情况,否则您几乎可以在界面构建器中执行所有操作。 始终设置相对于周围视图的约束,尽量不要将所有内容都修复为超级视图 尽可能使用纵横比约束。 尽量使用视图的内在约束大小,避免设置固定的宽度/高度。 请记住,当您设置太多约束时,您总会遇到您所面临的错误。所以总是认为约束“刚好够”在运行时计算出它的框架。不多也不少,但刚好够用。 利用不等式约束,它们非常有用。也不要忘记你有拥抱优先级和抗压优先级。

在您的错误中,我看到很多具有固定大小的约束,当您对这些视图有间距约束时,它们会干扰。所以从第一个开始,保留我提到的要点并删除你不需要的约束。

参考资料,

Auto layout Programming Guide Guide for Debugging Auto layout issues Objc issue Raywenderlich Guide Some Tips

【讨论】:

【参考方案2】:

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

我使用的是 Xcode 6.1.1

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

【讨论】:

以上是关于无法同时满足约束 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

无法同时满足约束 - 制图

无法同时满足约束 - LayoutConstraints

以编程方式应用自动布局约束时无法同时满足约束

自动布局约束:无法同时满足约束

关闭:“无法同时满足约束”[重复]

iOS - AutoLayout'无法同时满足约束'