2014-02-07 12 views
2

我对布局有一些非常具体的要求,迫使我创建一堆UILabels,使用sizeThatFits并相应地定位它们。这些标签随后定位在UITableView的每个单元格中。单元格的高度由标签的大小决定。需要更快的方式来计算UILabel sizeThatFits

当生成每个单元时,花费的时间是可以接受的。当我向表中添加新数据时会出现问题。由于单元格高度依赖于标签,我目前所做的是为单元格创建标签并测量结果高度。当我添加20个左右的新对象时,事情变得缓慢,因为tableView:heightForRowAtIndexPath:一次调用所有新对象。这种方法的第二个问题是,因为它使用了一堆UILabel,所以它必须在主线程上运行,所以事先进行计算并不是真正的选择。

我需要的是捕捉UILabel sizeThatFits的行为,只有更快,并且最好能够在后台线程上运行的好方法。

它只需要在iOS 7上运行

回答

2

的iOS 7增加了方法- (CGSize)sizeWithAttributes:(NSDictionary *)attrsNSString,让你一个字符串的大小。在iOS7下,UILabel对象的大小通常与此值非常接近。它可以在后台线程上调用。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html

您还可以实现您UITableViewDelegatetableView:estimatedHeightForRowAtIndexPath:。提供估计行高度可以改善加载表视图时的用户体验。如果表格包含可变高度的行,则计算其所有高度可能会很昂贵,从而导致更长的加载时间。使用估算功能可以将几何计算的成本从加载时间推迟到滚动时间。

+1

我不知道的tableView:estimatedHeightForRowAtIndexPath:,这是真的那么需要解决的性能。谢谢! – Reason

2

使用此方法可以在一个NSString通过,它将返回所估计的大小给定字体(I使用系统字体大小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; 
}