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

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

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

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

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

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

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

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

【问题讨论】:

标签: ios objective-c uitableview


【解决方案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.height 是 label 所需的高度,现在您可以为其添加一些值作为偏移量并返回它。

【讨论】:

  • 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有一些简单的方法来解决这个问题。
猜你喜欢
  • 2016-07-27
  • 2019-10-12
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2015-12-09
  • 2011-06-04
相关资源
最近更新 更多