代码之家  ›  专栏  ›  技术社区  ›  Jaanus

计算uilabel/uitableviewcell的多行文字高度:计算结果与实际绘图不同

  •  39
  • Jaanus  · 技术社区  · 15 年前

    这个一般性的主题在这里已经被问过多次:如何呈现具有不同文本量和高度的uiTableViewCells。标准答案是:使用sizeWithFont:ConstrainedToSize:LineBreakMode:计算表视图控制器委托中的高度。稍后,单元格会被绘制出来,如果需要的话,您可以使用[标签大小匹配]之类的东西,所有这些都像魔法一样工作。

    我的问题是:我正在对某些单元格进行包装,因为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,105.000000作为sizetofit调用后的维度。现在绘图时是5行而不是4行,文本溢出,我在UI中看到溢出。

    所以,对于同一个文本,我得到了两个不同的维度,计算不出来。是关于uilabel的吗?它有一些内部的空白吗?这种情况在某些文本中持续发生,但在其他文本中却没有发生,而且我也没有将其追溯到关于字符串的特定内容;似乎是随机的。 This topic 突出显示有两个处理过程:计算高度与实际绘图。这和我看到的是一致的。但我不明白到底发生了什么,也不知道如何解决。

    问题:为什么我会看到两个不同的计算大小,以及如何修复它?

    3 回复  |  直到 11 年前
        1
  •  36
  •   Community CDub    12 年前

    当然,解决办法是显而易见的 三十 发布后的秒数。也许对其他人也有用…

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

    修复方法是简单地重置帧 width 在调整大小以适应之前,宽度必须已知:

    CGRect labelFrame = label.frame;
    labelFrame.size.width = 310;
    label.frame = labelFrame;
    [label sizeToFit];
    
        2
  •  11
  •   Oleg    13 年前

    对于多行标签,需要设置

    cell.textLabel.numberOfLines = 0;
    

    然后

    [cell.textLabel sizeToFit];
    

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

        3
  •  6
  •   Dhara    11 年前
     titleSize = [title sizeWithFont:[UIFont systemFontOfSize:(CGFloat)17.0]
                                    constrainedToSize:CGSizeMake(280, 2000)
                                        lineBreakMode:NSLineBreakByWordWrapping];