2012-11-05 32 views
4

我有一个表格视图,其中我的单元格高度动态定义取决于它所代表的文本。自定义heightForRowAtIndexPath(CGSize sizeWithFont)与NSAttributedString iOS

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //getting my text for this cell, the row etc ... 
    ... 
    //here is the part interesting us 
    NSAttributedString* theText = [myTextForThisCell objectAtIndex:indexPath.row]; 

    NSInteger labelWidth = self.tableView.bounds.size.width-HORIZONTAL_CELL_PADDING; 

    CGSize textSize = [theText sizeWithFont:[UIFont systemFontOfSize:customFontSize] constrainedToSize:CGSizeMake(labelWidth, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping]; 

    return textSize.height+VERTICAL_CELL_PADDING; 
} 

好吧,现在我的问题。 tableview是扫描plist文件后显示包含给定字符串的行的搜索操作的结果。

到现在为止就是这样。但是现在用iOS 6和NSAttributedString可以轻松地将字符串中的大部分加粗,因此我决定大胆地使用搜索词。

这是工作,它大胆的话我想,但现在我不能计算单元格的高度,因为sizeWithFont要求一个NSString。由于粗体宽度较宽,我不能简单地使用没有属性的字符串计算单元格高度。

我只是卡在这里。

任何人都可以帮到我吗?

回答

23

事实上,我只需要阅读NSAttributedText的苹果文档。

在我来说,我有

CGRect rectSize = [theText boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT) 
         options:NSStringDrawingUsesLineFragmentOrigin context:NULL]; 

return rectSize.size.height+VERTICAL_CELL_PADDING; 

跟进的iOS 7

我一直在努力做的iOS7这项工作,与归属的文本替换代码的最后两行。

苹果文档说

在iOS系统7和后,该方法返回分数尺寸(在返回的CGRect的大小 成分);要使用返回的大小来设置 的视图,则必须使用ceil函数将其值提高到最接近的较大整数 。

哪种方式显然不适合我!对我来说,解决方案是给高度的细胞加+1。这可能是苹果的一个bug,但对我来说,现在一切都像iOS6一样。

CGRect rectSize = [theAttributedText boundingRectWithSize:CGSizeMake(labelWidth, MAXFLOAT) 
          options:NSStringDrawingUsesLineFragmentOrigin context:NULL]; 

return ceil(rectSize.size.height) + 1 + VERTICAL_CELL_PADDING; 
+0

只是因为iOS的6.0 –

+1

是当然的,NSAttributedText不可用之前iOS6的 – HpTerm

+1

太谢谢你了。你的回答帮了我很多! – Karun