UITableViewCell 动态高度

Posted

技术标签:

【中文标题】UITableViewCell 动态高度【英文标题】:UITableViewCell dynamic height 【发布时间】:2014-01-19 12:58:02 【问题描述】:

我已经对此进行了大量阅读,但似乎没有简单的解决方案。

我正在尝试制作一个应用程序来加载 NSArrayNSString cmets 以显示在 UITableView 中。 cmets 的大小各不相同。

如何让单元格调整其大小以显示每个 cmets 的全部内容?

我试图找到一个简单的解决方案,而不是使用魔术CFloat 数字。

Apple 的 API 中是否有一种方法可以让我在给定 NSString 注释和固定宽度的情况下计算 cell.detailTextLabel 所需的高度?

我想如果我能计算出这个高度,只需要设置单元格的高度和行的高度。

不太确定执行此操作的顺序是什么,因为我已经阅读了当heightForRow:AtIndexPath: 被调用时尚未创建单元格。

【问题讨论】:

ios calculate text height in tableView cell 的可能重复项 可能重复Dynamic Height of UITableViewCell 【参考方案1】:

计算tableView:heightForRowAtIndexPath:中文字的高度

您需要在 iOS 7+ 上使用 boundingRectWithSize:options:context:,在 iOS 6 及更低版本上使用 sizeWithFont:forWidth:lineBreakMode:。有关详细信息,请参阅苹果文档。

UIFont   *font    = [UIFont oka_commentLabelFont];
NSString *text    = [self commentForIndexPath:indexPath];
CGFloat cellWidth = 300.f;

CGSize boundingSize = CGSizeMake(widthForCell, CGFLOAT_MAX);
CGSize size;

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) 
  size = [text boundingRectWithSize:boundingSize
                            options:NSStringDrawingUsesLineFragmentOrigin
                         attributes:@ NSFontAttributeName : font 
                            context:nil].size;
 else 
  size = [text sizeWithFont:font
          constrainedToSize:boundingSize
              lineBreakMode:NSLineBreakModeWordWrap];


return size.height;

您需要将字体设置为要在单元格上使用的相同字体。如果你把它放在tableView 上的performUpdates 块中,你会得到一个很好的展开动画。

【讨论】:

似乎不起作用。我的文本仍然以省略号结尾,但单元格现在很大。 您是否在标签上设置了自动调整大小的掩码?制造商确保它具有可调整的高度。如果你使用 IB 很简单,请看图片:techotopia.com/images/2/27/… 你会希望它检查所有内容 - 所以它是红色的。 关闭单元格笔尖的自动布局,只需使用自动调整大小的蒙版即可满足您的需求。 您是否使用了正确的宽度输入?例如如果您的单元格是 200 像素宽,请确保它反映了行的高度。要检查的另一件事是确保字体相同! 将标签放在距离左侧 10px 和右侧 10px 的 UIView 上,这样它就不会紧贴视图的边缘。如果您想进一步讨论,请将其移至聊天【参考方案2】:

不要设置单元格的高度,设置行的高度,其余的由表格视图完成。

要计算文本的高度,请使用textRectForBounds:limitedToNumberOfLines: 询问标签,或使用sizeWithFont:constrainedToSize:lineBreakMode: 等多种方法之一询问字符串。

与单元格的大小相比,您可能需要处理标签周围的填充。

【讨论】:

所以一旦我将我的 cmets NSString 设置为 cell.detailTextLabel,我使用 textRectForBounds:limitedToNumberOfLines: 吗?但问题是,我直到 cellForRowAtIndexPath 才分配我的 cmets,所以当 heightForRowAtIndexPath 被调用时,我的 cell.detailTextLabel 仍然为零。 不,你应该有一个字符串数组或类似的东西。使用tableView:heightForRowAtIndexPath:中的字符串【参考方案3】:

是的,我们可以根据字体和换行模式计算UILabel 的高度。

UIFont * font = [UIFont systemFontOfSize:12.0];
CGSize newSize = [text sizeWithAttributes:@NSFontAttributeName:font];// You can add other attributes in dictionary to like line break mode.

这里你得到了UILabel中文本的新大小,现在在hegihtForCellAtIndexPath方法中你可以改变UITableViewCell的大小。 newSize.heightlabel 所需的高度,现在您可以为其添加一些值作为偏移量并返回它。

【讨论】:

sizeWithFont 已被弃用。 296是一个单元格的最大值吗?如果我试图让我的代码更易于适应 ipad 和其他设备,该怎么办?我不确定我会将您的代码放在哪里,heightForRowAtIndexPath?人们一直说,当 heightForRowAtIndexPath 被调用时,单元格及其文本标签仍然为零。 在您的新代码中,您何时使用 maximumLabelSize 变量?你只是把它扔到传递给 sizeWithAttribute 的字典里吗? 现在不需要了,我正在删除它。 如果您没有自定义单元格,您可以使用大小为 12 的 systemfont【参考方案4】:

使用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
   return [super tableView:tableView heightForRowAtIndexPath:indexPath];

【讨论】:

这与省略tableView:heightForRowAtIndexPath:的实现有何不同? 如果我决定继承 UITableView 或 UITableViewCell,你是否建议我使用它?因为我试图找到一个简单的解决方案而不诉诸子类化。我不想做很多编码来发现Apple有一些简单的方法来解决这个问题。

以上是关于UITableViewCell 动态高度的主要内容,如果未能解决你的问题,请参考以下文章

在动态高度 UITableViewCell 出现后更改其高度

动态高度 UITableViewCell 闪烁

Swift / 如何使用具有动态高度的 UITextView INSIDE UITableViewCell 与动态高度

带标签的 UITableViewCell 动态高度

我需要设置 UITableViewCell 动态高度,带有 UIImageView 的多个动态标签

根据单元格高度在 UITableViewCell 内动态设置 UIImageView 高度