为啥为所有四个边添加约束会导致错误?
Posted
技术标签:
【中文标题】为啥为所有四个边添加约束会导致错误?【英文标题】:Why does adding constraints for all four sides cause an error?为什么为所有四个边添加约束会导致错误? 【发布时间】:2015-08-06 09:44:02 【问题描述】:更新
编辑 XIB 文件,我在视图中我想要的位置添加了一个按钮,然后单击右下角的图钉图标,并固定按钮的所有四个侧面,并带有“限制到边距” " 未选中,因为这是我想要放置按钮的确切位置,我不希望它四处移动。
但我收到一条错误消息,提示“无法同时满足约束条件”。为什么会这样?
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)
(
"<_UILayoutSupportConstraint:0x9f494b0 V:[_UILayoutGuide:0x9f40370(20)]>",
"<_UILayoutSupportConstraint:0x9f3b6c0 V:|-(0)-[_UILayoutGuide:0x9f40370] (Names: '|':UIView:0x9f3feb0 )>",
"<_UILayoutSupportConstraint:0x9f418e0 V:[_UILayoutGuide:0x9f407c0(0)]>",
"<_UILayoutSupportConstraint:0x9f18010 _UILayoutGuide:0x9f407c0.bottom == UIView:0x9f3feb0.bottom>",
"<NSLayoutConstraint:0x9f40f10 V:[UIButton:0x9f40f40'Button']-(211)-[_UILayoutGuide:0x9f407c0]>",
"<NSLayoutConstraint:0x9f47ab0 V:[_UILayoutGuide:0x9f40370]-(539)-[UIButton:0x9f40f40'Button']>",
"<NSLayoutConstraint:0xa157b10 'UIView-Encapsulated-Layout-Height' V:[UIView:0x9f3feb0(568)]>"
)
Will attempt to recover by breaking constraint
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.
【问题讨论】:
IIRC 日志消息显示有问题的约束。你能把这个添加到你的 Q 中吗? 您应该阅读或观看任何有关自动布局的教程。例如youtube.com/watch?v=bprcg7ysyNA 【参考方案1】:自动布局技术处理对象和对象之间的关系,并超级查看它们将如何在屏幕上绘制。正如您所提到的,您正试图强制对象通过所有侧面,因此设置为特定位置,您可以尝试通过应用特定约束来考虑对象将如何在屏幕上绘制。
如果您想将固定宽度和高度的对象在所有方向上放置在屏幕中心,那么您可以尝试
Align->容器中的水平和垂直中心。 (否则,如果不满足约束条件,他们甚至会导致您的应用崩溃)
希望这会对你有所帮助。
【讨论】:
我为按钮设置了固定的宽度和高度,但我希望它能够将其固定到它所在的确切位置。所以我固定了所有 4 个边,但出现错误。可能是什么问题?好像还是没搞清楚。谢谢 你想放在哪个位置?如果您的视图覆盖全屏,您可以固定到 4 面。如果按钮用于 4 侧约束,自动布局系统开始从顶部添加约束,因此对于任何任何大小的类别,您的按钮都放置 250 像素,因此它被推到右侧。最好在容器中添加其他约束,例如尾随、前导、水平、垂直居中。 我更新了截图。我希望它位于那个确切的位置,并且能够通过不同的视图(例如景观等)停留在那个位置。实现这一目标的最佳方法是什么? 539+30+211>self.view.frame.size.height 由于这个原因,无法将您的按钮对象放在屏幕上您想要在屏幕中的确切位置......与宽度相同。这次希望你能理解【参考方案2】:如果您为按钮分配了高度或宽度,它将与您添加的约束冲突。如果您希望它始终处于某个 x、y 和特定大小,您应该固定顶部和左侧以及宽度和高度。如果您希望它动态调整大小,您应该固定所有 4 个边。
【讨论】:
我固定了所有 4 个面,但收到错误消息。可能是什么原因? 如果您固定了宽度和高度,您不想固定所有 4 个边。取消固定右侧和底部很可能是您要查找的内容。 我只固定了两侧,但它并没有位于我希望它在情节提要上的确切位置。在模拟器上,它位于其他位置。将对象放置在确切位置并能够在不同视图中进行调整的最佳方法是什么?谢谢! 这真的取决于你想要做什么。可能是您想将其固定在右下角,或者您也可以将其居中。我建议阅读本教程:raywenderlich.com/83129/…以上是关于为啥为所有四个边添加约束会导致错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我在 uiscrollview 顶部添加对象时,即使我将所有四个约束都设置为 0,对象也会下降一点?
为啥将 lambda 传递给受约束的类型模板参数会导致“不完整类型”编译器错误?