为什么Autolayout不会产生一致的结果?

时间:2016-04-30 00:32:29

标签: ios xcode swift uitableview autolayout

要么我不在乎,要么 AutoLayout 直接破碎。有人可以向我解释一下。我在TableViewCell中有一个TableView,它跨越了ViewController的宽度。我在TableViewCell内放了4个标签。我使用AutoLayout创建约束,使每个标签的宽度为TableViewCell的25%。然而,4个标签的宽度明显不同,它们甚至不能达到整个单元宽度的100%。这是截图。 (每个标签的水平位置都不明确,是的,但这不应该有所不同)。为什么它们的宽度不一样?为什么25%+ 25%+ 25%+ 25%不能达到100%?运行XCode 7.2并以iOS 9为目标。

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:3)

Error Symbol

此红色错误符号是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引领至superview领导
  • 将label4拖尾到superview的尾随

然后是每个相邻标签的约束:

  • label1.trailing to label2.leading,
  • ...

然后将每个标签的宽度约束等于label1:

  • label2 to label1
  • label3 to label1
  • label4 to label1

这应该是它。无需指定25%。

答案 3 :(得分:0)

对于自动布局约束,它需要为特定对象提供约束 x,y位置和高度,宽度 如果您没有给出任何一个,它会向您显示错误。 因此,请确保为您的对象提供所有必需的约束。

其他选项是ios 9及更高版本的uistackview。 这是一个链接,供您了解stackview https://m.youtube.com/watch?v=XqVWyA5PLwk