基于单元格内对象的自定义单元格高度

时间:2013-10-25 17:08:14

标签: ios uitableview height heightforrowatindexpath

我创建了一个自定义单元格,在其中放置了UITextView,我想根据UITextView文本长度的长度更改单元格的高度。我知道如何使用heightForRowAtIndexPath静态更改单元格高度,但我无法根据内容动态地执行此操作。

我在这个论坛和其他几个主题上已经阅读了十几个主题,但我找不到我想要的答案。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

in heightForRowAtIndexPath

 float height = [cell.textView.text sizeWithFont:cell.textView.font constrainedToSize:CGSizeMake(cell.textView.frame.size.width, 10000)].height;
 return height;

10000它是单元格的最大高度,实际上你可以设置最大整数值

答案 1 :(得分:0)

在textViewDidChange方法中,调用

[tableView beginUpdates];
[tableView endUpdates];

每当用户键入一个字母时,这将触发heightForRowAtIndexPath重新计算所有单元格大小。然后在heightForRowAtIndexPath中,您可以计算单元格的必要大小。

sizeWithFont方法将返回在UILabel中显示文本所需的大小,由于内容插入,行间距等原因,这与UITextView略有不同。我过去曾使用过一些hacky解决方案。如果您创建一个临时UITextView,设置它的文本,并使用[UIView sizeThatFits:constraintSize]来获得适合约束内所有内容的大小。 (关于此方法的文档有点不清楚 - 请查看此答案以获取更多信息:question about UIView's sizeThatFits

UITextView *temp = [UITextView alloc] initWithFrame:someArbitraryFrame];
temp.font = DISPLAY_FONT
temp.text = cell.textView.text;
//This gets the necessary size to fit the view's content within the specified constraints
CGSize correctSize = [self.temp sizeThatFits:CGSizeMake(CONSTRAINT_WIDTH, CONSTRAINT_HEIGHT)];
return correctSize.height

为了提高效率,您应该存储/延迟加载临时textView,这样您就不会为每个单元格创建新的UITextView,而是重新使用相同的单元来计算不同文本的高度。