使用NSString sizeWithFont:constrainedToSize:lineBreakMode调整大小时,表格单元格最后一行被截断:

时间:2011-08-18 17:03:25

标签: iphone objective-c ios cocoa-touch

当使用以下代码重新调整表格行的大小时,无论有多少行,最后一行文本总是被截止。但是增加了空白区域,看起来有足够的空间用于文本。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat restOfTheCellHeight = tableView.rowHeight - cell.detailTextLabel.frame.size.height;
    CGSize constrainedSize = CGSizeMake(cell.detailTextLabel.frame.size.width, CGFLOAT_MAX);
    CGSize textHeight = [cell.detailTextLabel.text sizeWithFont:cell.detailTextLabel.font constrainedToSize:constrainedSize lineBreakMode:cell.detailTextLabel.lineBreakMode];
    CGFloat newCellHeight = (textHeight.height + restOfTheCellHeight);
    if (tableView.rowHeight > newCellHeight) {
        newCellHeight = tableView.rowHeight;
    }
    return newCellHeight;
}

以下是cellForRowAtIndexPath中的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCellTableRowTypeSingleLineValueSmallLabel *cell = (CustomCellTableRowTypeSingleLineValueSmallLabel *)[tableView dequeueReusableCellWithIdentifier:@"CellTypeMultiLineLabelInCellSmallCell"];

    if (cell == nil) {
        NSArray *xibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellTableRowTypeSingleLine" owner:nil options:nil];
        for(id currentObject in xibObjects) {
            if([currentObject isKindOfClass:[CustomCellTableRowTypeSingleLineValueSmallLabel class]]){
                cell = (CustomCellTableRowTypeSingleLineValueSmallLabel *)currentObject;
            }
        }
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }   

    cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.detailTextLabel.numberOfLines = 0;

    cell.detailTextLabel.text = self.attributeStringValue;
    cell.textLabel.text = self.rowLabel;

    return cell;
}

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您需要调用[cell.detailTextLabel sizeToFit]才能使标签在cellForRowAtIndexPath中实际调整大小。它不会因为您将numberOfLines设置为0而自行调整大小。有关更多说明,请参阅this question and read its answers

答案 1 :(得分:0)

您正在heightForRowAtIndexPAth方法中正确计算单元格高度,但是在您的cellForRowAtIndexPath方法中,您实际上从未使用它来设置标签内的高度。

因此,表根据您的heightForRowAtIndexPath分配了适当的空间量,但随后将从cellForRowAtIndexPath返回的未提取的单元格插入该空间。我认为这可能是问题的原因,并会解释你所看到的结果。

在cellForRowAtIndexPath中,您需要使用相同的计算实际设置标签的高度。

 CGSize constrainedSize = CGSizeMake(cell.detailTextLabel.frame.size.width, CGFLOAT_MAX);
 CGRect cframe = cell.detailTextLabel.frame;
 cframe.size.height = constrainedSize.height;
 cell.detailTextLabel.frame = cframe;

您可能还需要实际设置内容视图框架(不确定它如何与非自定​​义单元格一起使用)。

我也不确定从heightForRowAtIndexPath方法调用cellForRowAtIndexPath是个好主意(直接访问直接访问用于大小计算的文本数据可能会更好。)

答案 2 :(得分:0)

结果我只需要在界面构建器中为标签启用所有自动调整大小选项。