要么我不在乎,要么 AutoLayout 直接破碎。有人可以向我解释一下。我在TableViewCell
中有一个TableView
,它跨越了ViewController的宽度。我在TableViewCell
内放了4个标签。我使用AutoLayout创建约束,使每个标签的宽度为TableViewCell
的25%。然而,4个标签的宽度明显不同,它们甚至不能达到整个单元宽度的100%。这是截图。 (每个标签的水平位置都不明确,是的,但这不应该有所不同)。为什么它们的宽度不一样?为什么25%+ 25%+ 25%+ 25%不能达到100%?运行XCode 7.2并以iOS 9为目标。
答案 0 :(得分:3)
此红色错误符号是Interface Builder,它告诉您它无法解决您的约束。在这种情况下,正如您所说,可能是因为您没有为标签提供x位置约束。
自动布局可以解决所有约束并获得正确的布局,也可以不解决,结果将是未定义的。请记住,自动布局是一种基于代数的过程,它通过使用您在约束中提供的已知值来解决未知值。如果没有提供足够且明确的已知值,则无法求解剩余值的等式,并且不能期望得到正确的结果。解决方案是创建足够的约束以使布局可解决。
作为一个注释,从iOS 9开始,我建议使用UIStackView来保存这些标签。 UIStackView的存在恰恰可以解决为这些类型的场景设置手动约束的痛苦。如果在单元格中使用了水平堆栈视图,则会将其边缘约束到单元格的边缘,将4个标签拖动到其中并将其设置为“Fill Equally”。这就是你所需要的一切!
答案 1 :(得分:2)
Xcode并不总是在故事板编辑器中强制执行您的约束,直到您要求它为止。在这种情况下,您可以选择表格视图单元格的内容视图,然后从菜单栏中选择编辑器>解决自动布局问题> BBRowTableViewCell中的所有视图>更新框架。 (有时需要两到三次尝试才能使Xcode正常运行。)
但是,你可能不喜欢这个结果。因为你没有约束标签的水平位置,所以Xcode可能会将它们全部堆积在单元格的左边缘,或者可能在单元格的边界以外甚至看不到它们的位置。
如果您的部署目标是iOS 9或更高版本,最简单的解决方案(如Daniel Hall所说)是将标签置于UIStackView
设置为“Fill Equally”,并将堆栈视图的边缘约束到单元格内容视图的边缘。
如果您的部署目标早于iOS 9,那么您应该创建user3802077描述的约束。
答案 2 :(得分:0)
这不是唯一的方法,但这就是我通常的做法。
正如您对每个标签的顶部和底部所做的那样,然后:
然后是每个相邻标签的约束:
然后将每个标签的宽度约束等于label1:
这应该是它。无需指定25%。
答案 3 :(得分:0)
对于自动布局约束,它需要为特定对象提供约束 x,y位置和高度,宽度 如果您没有给出任何一个,它会向您显示错误。 因此,请确保为您的对象提供所有必需的约束。
其他选项是ios 9及更高版本的uistackview。 这是一个链接,供您了解stackview https://m.youtube.com/watch?v=XqVWyA5PLwk