如何根据字符串大小在UITableViewCell中动态设置UITextView的高度?

我知道这里已经提出了这个问题,但它没有解决我的问题,因为接受的答案中的链接已关闭,最小的例子没有帮助。

这是我的自定义UITableViewCell及其所有约束的图片:

在此处输入图像描述

每个post都包含这些UI元素。 唯一可以使每个单元格的高度不同的元素是messageView ,因为它的高度取决于显示的字符串。 问题是,如何动态设置每个单元格的高度? 这是我现在拥有的(不工作,根本不显示messageView ):

 func cellForRowAt(indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(...) as! PostCell let message = ... cell.messageView.text = message return cell } func heightForRowAt(indexPath: IndexPath) -> CGFloat { var cellMinimumHeight: CGFloat = 120 if let cell = tableView.cellForRow(at: indexPath) as? PostCell { let size = cell.messageView.sizeThatFits(cell.messageView.frame.size) cellMinimumHeight += size.height } return cellMinimumHeight } 

heightForRowAt函数中, if未被执行,因此,所有单元格的高度都是cellMinimumHeight = 120

我怎么能让每个单元格的高度= 120 + messageView的高度?

———————————编辑1 ————— ——————

在图片中犯了一个错误, messageView的高度未设置

使用自动布局动态调整单元格大小时,您实际上不需要实现sizeThatFits(...) 。 如果约束设置正确,那么您只需要禁用UITextView的滚动。

来自代码:

 yourTextView.scrollEnabled = false 

来自IB:

选择文本视图并打开属性检查器 ,然后

在此处输入图像描述

在Attributes Inspector中,选择您的UITextView(messageView)并取消选中“Scrolling Enabled”。

然后更改您的UITextView(messageView)'s内容压缩抵抗优先级,如下所示:Horizo​​ntal = 750 Vertical = 1000

我希望这能帮到您。

只是禁用UITextview滚动…但这里没有使用UITextview,你也可以使用标签。

在HeightForRow tableview委托方法中删除那些东西并使用

 return UITableViewAutomaticDimension 

您已经使用约束来使单元格高度动态

形成苹果文档

要定义单元格的高度,您需要一个完整的约束链和视图(具有已定义的高度)来填充内容视图的上边缘和下边缘之间的区域。

所以对于你的情况你需要

cell的高度= 120 + messageView的高度?

因此,从Profile Image开始,从顶部到底部测量不间断的约束链

  1. 个人资料图片top = 10 + ImageHeight = 60 —-> 70

  2. MessageView top = 10 +设置消息的最小高度说20行一行如果每个单元格都应该有消息,即使一个单词并设置此高度大于或等于20 ,请确保设置Scroll enable = false所以消息Height minimum = 10 top + 20 + 10底—> 40

  3. 菜单堆栈视图高度—> 30

因此所有总数= 70 + 40 + 30 = 140这个默认高度没有单元格会小于此值

您还必须将表视图的rowHeight属性设置为UITableViewAutomaticDimension 。 您还必须为estimatedRowHeight属性分配值

 tableView.estimatedRowHeight = 130.0 tableView.rowHeight = UITableViewAutomaticDimension 

这是苹果文档