如何在不冻结主线程的情况下计算NSAttributedString的高度

时间:2014-01-01 23:47:58

标签: ios objective-c multithreading uitableview nsattributedstring

我正在开发一个应用程序,显示包含不同长度文本的帖子。当我通过服务器请求获取数据时,我将格式应用于NSAttributedString,计算特定宽度的文本高度,然后存储该值,以便tableView稍后调用heightForRowAtIndexPath:

对于每个新帖子我都称之为:

- (CGFloat)calculateTextViewHeight:(NSString *)string
{
    NSAttributedString *bodyText = [self formatString:string];
    UITextView *tempTextField = [[UITextView alloc] init];
    tempTextField.attributedText = bodyText;
    return [tempTextField sizeThatFits:CGSizeMake(cellWidth, FLT_MAX)].height;
}

这很有效。但是,当我一次循环50到200个帖子时,tableView会冻结。根据我的理解sizeThatFits:它是一个UIKit方法,因此必须在主线程上执行。

有没有办法在不挂断主线程的情况下计算NSAttributedString的高度。或者有可能在后台线程上运行sizeThatFits:吗?

1 个答案:

答案 0 :(得分:2)

当然,您不需要创建临时文本字段?

- (CGFloat)calculateTextViewHeight:(NSString *)string
{
  NSAttributedString *bodyText = [self formatString:string];
  CGRect rect = [bodyText boundingRectWithSize:CGSizeMake(width, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
  return CGRectGetHeight(rect);
}

调整选项参数以满足您的需求,

注意:这是在浏览器中编码的