根据 UITableViewCell 内的 contentSize 设置 UITextView 高度仅在初始表加载后有效

Posted

技术标签:

【中文标题】根据 UITableViewCell 内的 contentSize 设置 UITextView 高度仅在初始表加载后有效【英文标题】:Setting UITextView height based on contentSize inside a UITableViewCell only works after the initial table load 【发布时间】:2013-10-17 21:37:44 【问题描述】:

我在 UITableViewCell 中有一个 UITextView。我正在尝试根据内容大小设置 UITextView 的高度。在我的 cellForRowAtIndexPath 方法中,我有:

CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
....
cell.text.text = textString; // cell.text is the UITextView
CGRect frame = cell.text.frame;
frame.size.height = cell.text.contentSize.height;
cell.text.frame = frame;

return cell;

自定义单元格上还有其他对象,但没有任何约束。有趣的是,第一次加载表格视图时,UITextView 不会调整大小。但是,当通过向下或向上滚动加载另一个单元格时,UITextView 会根据上述代码调整到正确的高度。为什么初始表加载不正确。

UITextView 有一个默认的宽度和高度大小。让我知道是否可以添加更多详细信息。我没有实现 heightForRowAtIndexPath,但我正在做的测试并没有超过默认的单元格高度,所以无论如何这都不重要。

【问题讨论】:

麻烦的是你需要知道文本视图的高度,然后才能找出表格视图单元格的宽度。经过多次部分工作尝试后,我最终采用表格视图宽度并根据[UIDevice currentDevice].userInterfaceIdiom减去硬编码的像素数。 【参考方案1】:

您是否记录了 cell.text.contentSize.height 的值? 那一刻你没有得到正确的值,我认为你应该在下面的UITableView回调上设置高度:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

【讨论】:

cellForRowAtIndexPath: 和 willDisplayCell: 中记录了相同的值。我相信这与我如何重用单元格有关,因此我正在阅读该文档以确保我设置正确。 那么,cell.text.contentSize.height 的值相同,如果将此值设置为UITextView.frame.size.height,它不会生效?你怎么知道UITextView.frame.size.height 不会改变? UITextView 上有背景颜色吗?还是希望减少文本行数? cell.text.contentSize.height 的值不正确。这不是内容的真实高度。它确实生效,但它是错误的。我正在使用背景颜色进行测试。当通过向下或向上滚动加载更多单元格时,cell.text.contentSize.height 的值是正确的,背景颜色证实了这一点。 好的,所以你需要改变高度的计算,试试这个:CGSize textsize = [textView.text sizeWithFont:textView.font constrainedToSize:CGSizeMake(textView.frame.size.width,999) lineBreakMode: NSLineBreakByWordWrapping]; 它在初始加载后工作,但一开始不工作。因此,当加载包含此内容的 ViewController 时,我看到了错误的大小区域。如果我向下滚动并且应用程序加载更多单元格,则 UITextView 会正确调整大小。如果我向上滚动并重新加载原始单元格,则 UITextView 会正确调整大小。知道出了什么问题吗?【参考方案2】:

尝试在调用cell.text.contentSize之前添加[cell.text layoutIfNeeded]

在绘制之前,UITextField 将不知道 contentSize。调用layoutIfNeeded 应该会强制计算布局大小。

【讨论】:

在初始加载表格视图之后仍然无法工作。 在这种情况下,您可以使用sizeWithAttributes:of class NSString 来获取您的字符串将显示的大小。 它在初始表加载后工作,但不适用于第一个单元格。所以当包含这个的 ViewController 加载时,我看到错误的大小区域。如果我向下滚动并且应用程序加载更多单元格,则 UITextView 会正确调整大小。如果我向上滚动并重新加载原始单元格,则 UITextView 会正确调整大小。知道出了什么问题吗?【参考方案3】:

如果最终成功了,请尝试一下

cell.text.attributedText = [[NSAttributedString alloc]initWithString:textString];
float textViewWidth      = cell.text.frame.size.width;
[cell layoutIfNeeded];
cell.text.contentSize    = [cell.text sizeThatFits:CGSizeMake(textViewWidth, FLT_MAX)];
[cell.text sizeToFit];

【讨论】:

以上是关于根据 UITableViewCell 内的 contentSize 设置 UITextView 高度仅在初始表加载后有效的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 UItableviewcell 内的 UItableview 高度?

UITableViewCell 内的 UICollectionView:每个的“reloadData”顺序?

从外部源设置 UITableViewCell 内的内容?

UITableViewCell 内的 UIImageViews 不会被选中

UITableViewCell 内的 UIImageView

UITableViewCell 内的多个堆栈视图内的多行标签