需要一种更快的方法来计算UILabel sizeThatFits

时间:2014-02-07 19:54:29

标签: ios objective-c uilabel

我对布局有一些非常具体的要求,迫使我创建一堆UILabel,使用sizeThatFits并相应地定位它们。然后将这些标签放置在UITableView的每个单元格中。单元格的高度由标签的大小决定。

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

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

它只需要在iOS 7上运行。

2 个答案:

答案 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个对象的大小通常与此值非常接近。它可以在后台线程上调用。

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

您还可以在tableView:estimatedHeightForRowAtIndexPath:上实施UITableViewDelegate。在加载表视图时,提供行的高度估计可以改善用户体验。如果表包含可变高度行,则计算所有高度可能会很昂贵,因此会导致更长的加载时间。使用估计允许您将几何计算的一些成本从加载时间推迟到滚动时间。