NSString sizeWithFont:constrainedToSize:lineBreakMode:与实际Label高度不同

时间:2012-11-04 09:41:52

标签: 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;

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

这就是问题(最后):对于某些字符串(一些字符串长度)sizeWithFont:constrainedToSize:lineBreakMode:当我将其text属性设置为时,返回小于真实单元格的textLabel高度的值相同的字符串。因此,如果单元格的textLabels大于单元格的边界,则会有一些结果。当我从显示错误的字符串中添加\删除一些单词时,sizeWithFont:constrainedToSize:lineBreakMode:给出精确的高度,稍后用textLabel实际高度确认。

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

UPD1: 这里有一个textLabel高于在heightForRowAtIndexPath中计算的例子: tall textLabel

Normal textLabel with longer text

1 个答案:

答案 0 :(得分:2)

我建议您利用sizeToFit。首先,您将标签的宽度设置为horizontalConstraint,然后调用[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;
}