计算UILabel / UITableViewCell的多行文本高度:计算与实际绘图时的结果不同

时间:2010-01-25 22:11:52

标签: iphone uitableview uilabel

这里已经多次询问了这个一般性主题:如何使用不同数量的文本渲染UITableViewCells,从而改变高度。规范的答案是:使用sizeWithFont:constrainedToSize:lineBreakMode:在heightForRowAtIndexPath中计算表视图控制器委托中的高度。之后,单元格会被绘制出来,如果需要,你可以使用类似[label sizeToFit]的东西,而且所有东西都像魔法一样。

我的问题:我正在为一些单元格进行换行,因为sizeWithFont:从实际绘图中返回不同的维度。

一个具体的例子:

文字是这样的:“人们忘记了@BillGates在1993年从NEC获得了性感的1/4英寸厚的板岩。本周发生的任何事情都不会与硬件有关!”

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是从NIB加载为UITableViewCell的一部分。在IB中我将它设置为310px宽。)

这应该返回与上面完全相同的大小。相反,我得到281.000000,10500.000000作为sizeToFit调用后的尺寸。现在它在绘制时间而不是4行,并且文本溢出,我看到UI中的溢出效应。

因此,对于相同的文字,我得到了两个不同的维度,并且无法弄明白。这是关于UILabel的吗?它有一些内在的边缘吗?对于某些文本而言,这种情况不断发生,而其他文本却没有发生,我没有将其追溯到字符串的特定内容;似乎随意。 This topic强调有两个处理过程:计算高度与实际绘图。这与我所看到的一致。但我不明白究竟发生了什么或如何解决它。

问题:为什么我会看到两种不同的计算尺寸,我该如何解决?

3 个答案:

答案 0 :(得分:36)

当然,解决方案在发布后显然 30 秒。也许对其他人有用......

sizeWithFont:的大小是正确的。我以上述方式计算的尺寸不正确,因为[label sizeToFit]会减小标签框架的宽度。在后续调用相同代码时,它从可能已经减少的帧开始。

修复方法是在调整大小以适应之前,简单地将框架width重置为已知的良好宽度:

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

答案 1 :(得分:11)

对于多行标签,您需要设置

cell.textLabel.numberOfLines = 0;

然后

[cell.textLabel sizeToFit];

但是对于漂亮的视图,你需要添加一些填充像素。你的应用程序会很棒!

答案 2 :(得分:6)

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