Objective c NSString sizeWithFont:constrainedToSize:lineBreakMode:与实际标签高度不同

Objective c NSString sizeWithFont:constrainedToSize:lineBreakMode:与实际标签高度不同,objective-c,ios,string,uitableview,height,Objective C,Ios,String,Uitableview,Height,下面是它的运行方式:我正在实现一个UITableView(分组样式,带有1个部分),其中包含标准UITableViewCells(样式-UITableViewCellStyleSubtitle)作为内容。 我的textLabel.text可能非常长,这就是为什么我在TableView中设置了一些参数:cellforrowatinexpath: cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.number

下面是它的运行方式:我正在实现一个UITableView(分组样式,带有1个部分),其中包含标准UITableViewCells(样式-UITableViewCellStyleSubtitle)作为内容。 我的textLabel.text可能非常长,这就是为什么我在TableView中设置了一些参数:cellforrowatinexpath:

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:当我将其文本属性设置为同一字符串时,返回的值小于实际单元格的textLabel高度。因此,如果单元格的文本标签大于单元格的边界,则会出现一些错误。当我从显示错误的字符串中向\添加\删除某些单词时,sizeWithFont:constrainedToSize:lineBreakMode:会给出确切的高度,稍后会与textLabel实际高度进行确认

我想这可能是字体的问题,但正如你看到的,字体是一样的。 从这里挖到哪里?;)

UPD1: 以下是textLabel的高度高于HeightForRowatineXpath中计算的高度的示例:


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


Tobi,谢谢你的建议,但是调用CellForRowatineXpath:from HeightForRowatineXpath:会创建无限循环:我正在尝试获取一个单元格,在返回它之前,TableView想要获取它的高度…我正在考虑另一种从HeightForRowatineXpath:获取单元格的方法,但没有找到解决方案。你认为这可能吗?我没有想想看。我已经编辑了我的答案。只需创建一个新的
UILabel
,设置它的属性并从中获取高度。不幸的是,它不起作用,单元格的行为与以前一样。有趣的是,有一些边缘文本长度导致了这个问题。在图片上,你可以看到,当我向单元格文本添加一些字符时,它就开始不起作用了o render OK(当我从中删除一些字符时也会发生同样的情况)。不确定下一步要去哪里…所以我通过修改约束值“解决”了这个问题,它现在不知怎么起作用了。但是当我开始采用代码来改变设备方向时,我会遇到同样的问题;)
- (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;
}