NSLayoutConstraint 出错
Posted
技术标签:
【中文标题】NSLayoutConstraint 出错【英文标题】:Error with NSLayoutConstraint 【发布时间】:2015-01-19 01:55:02 【问题描述】:我有一个带有静态单元格的 UITableViewController。在第一个单元格中,我有一个 uipickerView。 (我在其他单元格中还有其他东西,但我认为这无关紧要。)我试图以两种方式将 pickerView 置于单元格中。第一个 - 我在周围添加了 4 个约束。这给了我一个错误,当我在模拟器上运行它时没有正确显示。第二种方法是,我为 x 和 y 添加了 2 个约束。这也给了我一个错误。
以下是错误:
2015-01-18 15:47:49.533 myApp[1476:54966] 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:0x7fcbc24e9cb0 UITableViewCellContentView:0x7fcbc24da620.centerX == UIPickerView:0x7fcbc24eb1e0.centerX>",
"<NSIBPrototypingLayoutConstraint:0x7fcbc254d7e0 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIPickerView:0x7fcbc24eb1e0](LTR) (Names: '|':UITableViewCellContentView:0x7fcbc24da620 )>",
"<NSIBPrototypingLayoutConstraint:0x7fcbc2556c00 'IB auto generated at build time for view with fixed frame' H:[UIPickerView:0x7fcbc24eb1e0(600)]>",
"<NSLayoutConstraint:0x7fcbc25be170 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7fcbc24da620(375)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fcbc24e9cb0 UITableViewCellContentView:0x7fcbc24da620.centerX == UIPickerView:0x7fcbc24eb1e0.centerX>
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.
它对 Y 说了同样的话,但我把它删掉了,这样会更清楚。
如你所知,我是初学者,所以请不要对我太苛刻。
更新
我去掉了两个约束(x 和 y),并在左侧和右侧添加了一个约束。当我运行它时,pickerView 像 ipad 一样散开,(可能是 600)它给了我以下错误:
<NSLayoutConstraint:0x7ffcf1d76200 UITableViewCellContentView:0x7ffcf1d0a2d0.trailingMargin == UIPickerView:0x7ffcf1d78a60.trailing - 8>",
"<NSLayoutConstraint:0x7ffcf1d529b0 UIPickerView:0x7ffcf1d78a60.leading == UITableViewCellContentView:0x7ffcf1d0a2d0.leadingMargin - 8>",
"<NSIBPrototypingLayoutConstraint:0x7ffcf1c74700 'IB auto generated at build time for view with fixed frame' H:[UIPickerView:0x7ffcf1d78a60(600)]>",
"<NSLayoutConstraint:0x7ffcf1dbf220 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7ffcf1d0a2d0(375)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7ffcf1d76200 UITableViewCellContentView:0x7ffcf1d0a2d0.trailingMargin == UIPickerView:0x7ffcf1d78a60.trailing - 8>
【问题讨论】:
这是哪个错误,第一种还是第二种方式? 我无法重现新问题。约束对我有用。请参阅我再次修改的答案。 显然,您的问题是NSIBPrototypingLayoutConstraint
试图将您的选择器视图设置为 600 宽(并且成功)。但我不知道那是从哪里来的;我没有。
您使用的是过时的 Xcode 版本吗?
我正在使用最新版本的 xcode。顺便说一句,我让单元格返回的高度为 163,pickerView 为 162。不确定是否有区别
【参考方案1】:
实际上很容易阅读错误消息中的约束列表:只需稍加练习即可。您有以下内容:
选择器视图在其父视图中水平居中
选择器视图的左边缘位于其父视图的左边缘
选择器视图的宽度为 600
稍加思考就很容易看出,只有当单元格为 600 像素宽时,这些才能被协调。但事实并非如此——这是列表中的第四个约束告诉你的:
[但是]superview的宽度是375现在您可能会问:我该如何摆脱这场冲突?我什至没有创建一些约束!我认为的方法是删除“居中”约束,并将选择器视图的左边缘和右边缘约束到其父视图。因此它的宽度将由其父视图的宽度决定,而不是与之冲突。
编辑我试过了,效果很好:
这是在模拟器中运行的静态表格视图的单个单元格。选择器视图被添加到单元格中,我应用了三个约束:顶部、左侧和右侧。控制台中没有出现任何问题。
以下是尺寸检查器中显示的约束和其他信息:
【讨论】:
那么我该怎么做才能解决这个问题?我不希望它只适用于 iPhone。我也想要它用于 ipad 顺便说一下,@MikeSteevson,如果您在 Interface Builder 中遇到有问题的约束,它会警告您。您可能陷入这种情况的唯一方法是忽略这些警告。不要忽视他们!在您摆脱 Interface Builder 关于约束的警告之前,运行您的项目绝对没有意义 - 这样做没有好处。 你是对的,它应该显示警告或其他东西,但它没有在这里。 (我不确定为什么。)我理解你在答案中写的内容,但由于某种原因,当我做你写的事情时它没有帮助。我将更新我的问题,以便您可以看到它现在显示的错误 非常感谢。如果需要,我会在自己的机器上尝试一下。以上是关于NSLayoutConstraint 出错的主要内容,如果未能解决你的问题,请参考以下文章