objective-c - NSString sizeWithFont :constrainedToSize:lineBreakMode: differs from actual Label height

标签 objective-c ios string uitableview height

事情是这样的:我正在实现一个 UITableView(分组样式,有 1 个部分),以标准 UITableViewCells(样式 - UITableViewCellStyleSubtitle)作为内容。 我的 textLabel.text 可能非常长,这就是我在 TableView:cellForRowAtIndexPath:

中设置一些参数的原因
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont boldSystemFontOfSize:CELL_FONT_SIZE];
cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.detailTextLabel.numberOfLines = 0;
[self configureCell:cell atIndexPath:indexPath];

为了调整单元格高度,我实现了 tableView:heightForRowAtIndexPath: 如下:

Test *test = (Test *)[self.frc objectAtIndexPath:indexPath];
NSString *cellText = test.test_name;

UIFont *cellFont = [UIFont boldSystemFontOfSize:CELL_FONT_SIZE];

CGFloat horizontalConstraint;
if (self.bagdePresent)
{
    // there will be big badge!
    horizontalConstraint = 250.0f;
} else
{
    // there will NO badge
    horizontalConstraint = 280.0f;
}

CGSize constraintSize = CGSizeMake(horizontalConstraint, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

// return label height, 20 as gap, 30 for rating image,
return labelSize.height + 20 + 30;

首先,我检查单元格中是否有角标(Badge)图像,如果有,我会减少可用的水平空间。

这是问题(最后):对于某些字符串(某些字符串长度), sizeWithFont:constrainedToSize:lineBreakMode: 当我将其 text 属性设置为同一字符串时,返回的值小于实际单元格的 textLabel 高度。结果是,如果单元格的文本标签大于单元格的边界。当我在显示错误的字符串中添加\删除一些单词时, sizeWithFont:constrainedToSize:lineBreakMode: 给出准确的高度,稍后用 textLabel 实际高度进行确认。

我认为这可能是字体问题,但正如你所看到的,字体是相同的。 从这里往哪里挖? ;)

UPD1: 以下是 textLabel 高于 heightForRowAtIndexPath 中计算值的示例: tall textLabel

Normal textLabel with longer text

最佳答案

我建议利用sizeToFit。首先,将标签的宽度设置为 horizo​​ntalConstraint,然后调用 [cell.textLabel sizeToFit] (这将调整标签的高度以适应其内容,但保留您设置的宽度(几乎 - 这意味着它可能会变得更窄):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat horizontalConstraint;
    if (self.bagdePresent)
    {
        // there will be big badge!
        horizontalConstraint = 250.0f;
    } else
    {
        // there will NO badge
        horizontalConstraint = 280.0f;
    }

    Test *test = (Test *)[self.frc objectAtIndexPath:indexPath];
    NSString *cellText = test.test_name;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.text = test.test_name;
    UIFont *cellFont = [UIFont boldSystemFontOfSize:CELL_FONT_SIZE];           
    label.lineBreakMode = UILineBreakModeWordWrap;
    label.numberOfLines = 0;
    label.font = cellFont;

    CGRect frame = label.frame;
    frame.size.width = horizontalConstraint;
    label.frame = frame;
    [label sizeToFit];

    CGSize labelSize = label.frame.size;

    // return label height, 20 as gap, 30 for rating image,
    return labelSize.height + 20 + 30;
}

关于objective-c - NSString sizeWithFont :constrainedToSize:lineBreakMode: differs from actual Label height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217515/

相关文章:

iphone - UITapGestureRecognizer 无法添加到 UIView?

objective-c - 基于 iOS 页面的应用程序清除颜色问题

objective-c - 加载 webview 时显示 NSWindow

两个字符串中不重复的相似字符的计数

Java - 将字符串与 equals 进行比较,但表示类型不匹配 string-bool

ios - 如何取消隐藏 UITableView 部分的动画?

ios - 返回带 ABPerson 后缀的联系人标识符

ios - UIScrollView 底部的 UIButton 不起作用

ios - UICollectionViewCell 滚动后重叠错乱

ruby - 如何在 Ruby 字符串中每 5 个字符插入标记?