Ios 如何为自调整大小的单元格正确设置自动布局约束

Ios 如何为自调整大小的单元格正确设置自动布局约束,ios,objective-c,uitableview,autolayout,Ios,Objective C,Uitableview,Autolayout,我在iOS 7和iOS 8中看到了很多关于自我调整单元格大小的指南。不幸的是,它们都显示了非常简单的情况(我指的是两个宽度相同的UILabel,它们像第一个一样放置在第二个之下,它们的约束也非常简单)。所以我的处境似乎不太困难,但我无法解决问题。 我相信这对大多数人来说都很容易,希望有人能帮上忙。问题是有UITableViewCell,里面有3个子视图。 每个视图都是UILabel。按此顺序放置的标签:两个标签位于UITableViewCell顶部,尺寸固定,一个标签位于底部,宽度固定,但高度动

我在iOS 7和iOS 8中看到了很多关于自我调整单元格大小的指南。不幸的是,它们都显示了非常简单的情况(我指的是两个宽度相同的UILabel,它们像第一个一样放置在第二个之下,它们的约束也非常简单)。所以我的处境似乎不太困难,但我无法解决问题。 我相信这对大多数人来说都很容易,希望有人能帮上忙。问题是有
UITableViewCell
,里面有3个子视图。 每个视图都是
UILabel
。按此顺序放置的标签:两个标签位于
UITableViewCell
顶部,尺寸固定,一个标签位于底部,宽度固定,但高度动态。我应该如何正确设置约束以使我的
UITableViewCell
能够自我调整大小?

自动调整大小的关键是一组垂直约束,这些约束将决定单元格高度。这并不复杂,因为没有两个高度不同的水平标签

由于
标题标签
日期标签
高度没有变化,因此只需将dynamicLabel约束到两个顶部标签之一

在本例中,我们将任意选择
headerLabel
以在垂直约束中使用。标签之间的间距没有指定,所以我假设为10。根据需要进行调整

对于水平约束,请将前导和尾随空间设置为superview

您的垂直约束看起来就像“V:|-10-[headerLabel]-10-[dynamicLabel]-10-|”(应该是

dynamicLabel
将根据需要增长,前提是将其
numberOfLines
设置为0,其高度最终将决定单元格的高度

假设约束设置正确,并且情节提要单元高度与约束设置的垂直高度完全匹配,则不应看到任何情节提要警告或错误,应该可以继续

8.4确实解决了许多问题,因此您不应该需要任何特定的(LayoutSubView/preferredMaxLayoutWidth/reloadData)代码来解决早期的8.x问题


另一方面,一般的技巧是将约束固定到superview边距,而不是superview。这意味着您的前导、尾随、顶部和底部约束可以是2,而不是10,因为边距通常为8。这让您的空白空间适应不同的设备,这是一个非常好的选择。

选择每一个标签和giv前导和尾随约束,永远不要为iOS7提供宽度和高度约束。对于iOS7,您仍然需要使用屏幕外原型计算每个单元格的高度。只有iOS8具有自动单元格大小调整功能。谢谢您的回答。我将尝试一步一步地完成所有操作,但我有一个问题。您说过垂直约束必须是“V:|-10-[headerLabel]-10-[dynamicLabel]-10-|”但是我的
dynamicLabel
必须始终位于单元格底部,如果
headerLabel
dynamicLabel
之间的值为10pt,它是否总是正确的?是的。
dynamicLabel
将始终位于“底部”单元格的,因为它的下边距是10。不管您希望顶部和底部标签之间的空白量是多少--根据需要增加值以获得所需的外观--它应该保持不变。唯一的“非常量”将是动态标签的高度,自动布局将为您计算该高度。因此,自定大小的单元格高度=10+标题高度+10(标签间距)+n(可变动态标签高度,由自动布局计算)+10。非常感谢!)工作起来很有魅力,但是有一个knonwn bug,而且由于某些原因,当tableview第一次显示时,并不是每个单元格的大小都正确。我尝试了
[self.tableView重载数据]强制进入
-viewdide
但当初始布局不正确时,它没有帮助,这通常是因为单元格宽度最初与tableView宽度不匹配,这导致标签最初布局错误。如果在屏幕上滚动单元格后一切正常,然后再打开,则您的约束是正确的。