我对布局有一些非常具体的要求,迫使我创建一堆UILabel,使用sizeThatFits并相应地定位它们。然后将这些标签放置在UITableView的每个单元格中。单元格的高度由标签的大小决定。
生成每个单元格时,所需的时间是可以接受的。当我向表中添加新数据时会出现问题。由于单元格高度取决于标签,我目前所做的是为单元格创建标签并测量结果高度。当我添加20个左右的新对象时,当tableView:heightForRowAtIndexPath:
一次调用所有新对象时,事情会变慢。这种方法的第二个问题是,由于它使用了一堆UILabel,它必须在主线程上运行,因此事先进行计算并不是一个真正的选择。
我需要的是捕获UILabel sizeThatFits行为的好方法,只是更快,最好能够在后台线程上运行。
它只需要在iOS 7上运行。
答案 0 :(得分:3)
使用此方法传入NSString,它将返回给定字体的估计大小(我在这里使用系统字体大小15,320是单元格的宽度):
- (CGSize)sizeOfText:(NSString*)text{
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0f]}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){320, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
return CGSizeMake(rect.size.width, rect.size.height);
}
然后在heightForRowAtIndexPath
中,您可以设置单元格的大小:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self sizeOfText:[yourdatasource objectAtIndex:indexPath.row]].height;
}
答案 1 :(得分:2)
iOS 7将方法- (CGSize)sizeWithAttributes:(NSDictionary *)attrs
添加到NSString
,为您提供字符串的大小。在iOS7下,UILabel
个对象的大小通常与此值非常接近。它可以在后台线程上调用。
您还可以在tableView:estimatedHeightForRowAtIndexPath:
上实施UITableViewDelegate
。在加载表视图时,提供行的高度估计可以改善用户体验。如果表包含可变高度行,则计算所有高度可能会很昂贵,因此会导致更长的加载时间。使用估计允许您将几何计算的一些成本从加载时间推迟到滚动时间。