NSAttributedString boundingRectWithSize为表格单元格返回了错误的高度?

时间:2014-06-10 20:43:16

标签: ios uitableview ios7 nsattributedstring

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSAttributedString *aString = [self.rows objectAtIndex:indexPath.row];

   CGRect r = [aString boundingRectWithSize:CGSizeMake(self.tableView.bounds.size.width, CGFLOAT_MAX)
                                 options:NSStringDrawingUsesLineFragmentOrigin context:nil];

   r.size.height += 50.0f;
    return r.size.height;
}

我的self.rows包含NSAttributedString,它们具有不同的大小。 有些只包含一个单词,有些包含多行(包含换行符) 我需要在高度上添加50.0f,否则我的单元格不会显示较长文本的所有内容。

问题是,如果文本只包含一个单词,我会得到很多填充。 我的表格单元格只包含一个带有以下自动布局的标签:

@"V:|[customLabel]|"
@"H:|-[_customLabel]-|"

我做错了什么?

1 个答案:

答案 0 :(得分:8)

不确定你做错了什么,但在我自己的代码中,我已经有了一行UITextView,我这样做了:

// tableView:cellForRowAtIndexPath:
BOOL iPad = [UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPhone;
CGFloat width = tableView.frame.size.width - (iPad ? 86 : 16);
CGSize idealSize = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)];
textView.frame = CGRectMake(10, 1, width, idealSize.height);

// tableView:heightForRowAtIndexPath:
[self tableView:tableView cellForRowAtIndexPath:indexPath]; // make sure the text view exists is calculated.

return [textView frame].size.height + 4;

该代码实际上花了我几天的研究来做对,它的确有效。拥有未知高度的表行并不像初看起来那么容易。