UITableViewCell动态高度

时间:2014-01-19 12:58:03

标签: ios objective-c uitableview

我已经完成了很多阅读,但似乎没有简单的解决方案。

我正在尝试创建一个加载NSArray NSString个评论的应用,以显示在UITableView中。评论的大小各不相同。

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

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

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

我想如果我可以计算这个高度,那么所需要的只是设置单元格的高度和行的高度。

由于我已经阅读了heightForRow:AtIndexPath:被调用时尚未创建的单元格,因此不确定要执行此操作的顺序。

4 个答案:

答案 0 :(得分:2)

计算tableView:heightForRowAtIndexPath:

中文字的高度

您需要在iOS 7及以上版本的iOS 7及boundingRectWithSize:options:context:上使用sizeWithFont:forWidth:lineBreakMode:。有关详细信息,请参阅Apple文档。

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;

您需要将字体设置为要在单元格上使用的相同字体。如果你将它放在performUpdates的{​​{1}}块中,那么你将得到一个很好的扩展动画。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

是的,我们可以根据字体和换行模式计算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所需的高度,现在您可以为偏移量添加一些值并将其返回。

答案 3 :(得分:-1)

使用

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