2010-01-25 37 views
39

這個一般主題在這裏被多次提出:如何使用不同數量的文本呈現UITableViewCells,從而改變高度。規範的答案是:您使用sizeWithFont計算heightForRowAtIndexPath中的表視圖控制器委託中的高度:constrainedToSize:lineBreakMode :.之後,單元格被繪製,並且如果需要,您可以使用[label sizeToFit]之類的東西,並且所有的東西都像魔術一樣。計算UILabel/UITableViewCell的多行文本高度:計算vs實際繪圖時的結果不同

我的問題:我正在包裝某些單元格,因爲sizeWithFont:從實際繪圖返回不同的尺寸。

一個具體的例子:

的文字是這樣的:「!人們忘記了@BillGates在1993年有一個性感的四分之一英寸厚的石板背面從NEC無論發生什麼事情,本週將不會被有關硬件」

CGSize theSize = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(310.0f, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap]; 
NSLog(@"calculated size for %@: %f, %f",text, theSize.width, theSize.height); 

返回:306.000000,84.000000。 (即4行,17px字體和4px行間距,21px領先。)好。

但是,後來當實際繪製細胞:

label = (UILabel *)[cell viewWithTag:3]; 
label.text = [NSString stringWithFormat:@"%@", text]; 
label.lineBreakMode = UILineBreakModeWordWrap; 
label.font = [UIFont systemFontOfSize:17.0f]; 
CGSize labelSize; 
labelSize = label.frame.size; 
NSLog(@"label size before resizing: %f, %f", labelSize.width, labelSize.height); 
[label sizeToFit]; 
labelSize = label.frame.size; 
NSLog(@"label size after resizing: %f, %f for text %@", labelSize.width, labelSize.height,text); 

(。的UILabel裝載從筆尖的UITableViewCell的一部分,在IB我將它設置爲310px寬)

這應該返回這裏與上面相同的尺寸。相反,我得到281.000000,105.000000作爲sizeToFit調用後的尺寸。現在在繪圖時間是5條線而不是4條,文本溢出了,我看到UI中的溢出效應。

因此,對於相同的文本,我得到了兩個不同的維度計算,並不能算出來。這是關於UILabel的嗎?它有一些內部邊緣嗎?對於一些文本而言,這種情況會持續發生,但對其他文本卻不會發生,我也沒有將它追溯到特定的字符串;似乎隨機。 This topic強調有兩個處理過程:計算高度與實際繪圖。這與我所看到的一致。但我不明白究竟發生了什麼或如何解決它。

問題:爲什麼我看到兩種不同的計算大小,以及如何解決?

回答

36

當然,發佈後的解決方案顯然是秒。也許對別人有用...

大小由sizeWithFont:是正確的。以上述方式計算的尺寸不正確,因爲[label sizeToFit]會減小標籤框架的寬度。在隨後調用相同的代碼時,它開始時可能已經被縮小了。

此修復程序是大小,以適應前框架width簡單地恢復到已知的良好寬度:

CGRect labelFrame = label.frame; 
labelFrame.size.width = 310; 
label.frame = labelFrame; 
[label sizeToFit]; 
+0

謝謝,那就是我一直在尋找的:** CGSize labelSize; labelSize = UILabelName.frame.size; ==> labelSize.height ** – cV2 2011-03-14 13:56:43

11

您需要設置

cell.textLabel.numberOfLines = 0; 

多標籤,然後

[cell.textLabel sizeToFit]; 

但爲了美觀,你需要添加一些填充像素。而你的應用將非常棒!

5
titleSize = [title sizeWithFont:[UIFont systemFontOfSize:(CGFloat)17.0] 
           constrainedToSize:CGSizeMake(280, 2000) 
            lineBreakMode:NSLineBreakByWordWrapping];