2012-11-05 65 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