UITableViewCell 动态高度
Posted
技术标签:
【中文标题】UITableViewCell 动态高度【英文标题】:UITableViewCell dynamic height 【发布时间】:2014-01-19 12:58:02 【问题描述】:我已经对此进行了大量阅读,但似乎没有简单的解决方案。
我正在尝试制作一个应用程序来加载 NSArray
的 NSString
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.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有一些简单的方法来解决这个问题。以上是关于UITableViewCell 动态高度的主要内容,如果未能解决你的问题,请参考以下文章
在动态高度 UITableViewCell 出现后更改其高度
Swift / 如何使用具有动态高度的 UITextView INSIDE UITableViewCell 与动态高度