让 UITableViewCell 使用自动布局调整自身大小

Posted

技术标签:

【中文标题】让 UITableViewCell 使用自动布局调整自身大小【英文标题】:Have UITableViewCell resize itself with autolayout 【发布时间】:2013-08-27 23:47:08 【问题描述】:

我在 UITableViewCell 中有 3 个标签,并设置了标签,以便它们自动换行。如果他们自动换行,则文本将进入下一个单元格。如何让 AutoLayout 根据内容展开单元格,而无需在 heightForRowAtIndex 方法中编写代码?难道没有一个约束我可以用来根据 contentView 自动调整单元格吗?

如果文本不包含在标签中,则单元格看起来很好。一旦包裹起来,就是问题发生的时候,我想让单元格调整大小以适应内容,并且底部标签和底部之间的间距与顶部和顶部标签之间的间距相同。

【问题讨论】:

【参考方案1】:

很遗憾,您不能这样做。表格视图首先计算自己的总高度,并且在加载时对每个单元格的大小有一个固定的概念,它不会从外向内确定它的高度,也不会让布局约束改变单元格的高度。

如果您考虑表格是如何工作的,以及单元格重用,那么如果不加载每个单元格并将其添加到滚动视图,并对整个内容执行布局传递,您就无法真正根据其单元格调整表格大小。这可能会导致性能很差。

您可以尝试填充“空闲”单元格(即您刚刚实例化的单元格,未添加到表中)并在计算 heightForRow 时为数据源中的每一行布置它。

【讨论】:

我自己使用一个空闲的单元格。但最好使用几个单元格,或者您自己管理表格视图中的单元格数量。 当您说免费单元格时,您的意思是在代码中创建它?所以我想我需要做label1.size.height + label2.size.height + label3.size.height + topPadding + bottomPadding 那将是单元格的高度?还是我需要为每个单元格做 constraintToSize? 我的意思是,在代码中创建一个单元格,填充它,然后调用 [layoutIfNeeded] 来确定大小。如果您的约束设置正确,那么这应该计算出显示内容所需的单元格的确切大小。【参考方案2】:

在加载单个单元格时,在填充标签之后,但在加载单元格实例之前,请检查标签高度。

 Something like:
     cell.frame.size.height

如果高度足够大,您知道标签已经换成了两行,那么增加您要加载的单元格的高度。

【讨论】:

以上是关于让 UITableViewCell 使用自动布局调整自身大小的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 的 nib 文件中的自动布局

如何让 UITableViewCell 中的 imageView 大小固定

简单自定义 UITableViewCell 的自动布局错误

UITableviewCell 高度自动布局

出队的 UITableViewCell 在滚动之前布局不正确(使用自动布局)

如何使用 Masonry 自动布局 UItableviewCell 高度