动态高度UILabel在移动屏幕后工作

时间:2013-07-07 22:59:45

标签: ios uitableview uilabel sizetofit

我正在尝试在UITableViewCells中创建多行动态UILabel。我有一个自定义的UITableViewCell,它有一个'comment'标签。单元格和标签在故事板中创建。

我可以根据要存储在UILabel中的多行数据(使用heightForRowAtIndexPath)正确计算UITableViewCells的高度。但是,我的问题在于实际的UILabel内容。 UILabel内容将仅在表加载时显示1行数据。但是,一旦包含多行UILabel数据的单元格在屏幕外移动并返回到屏幕上,多行数据就会在UILabel中正确显示多行。有没有办法解决这个问题,以便在表格加载时正确显示多行数据?

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cCell = (CustomCell *)cell;
    MyObject = [myArray objectAtIndex:indexPath.row];

    cCell.commentLabel.frame = CGRectMake(65.0f, 28.0f, 243.0f, 200.0f);
    cCell.commentLabel.text = MyObject.multi_line_text_data;
    cCell.commentLabel.adjustsFontSizeToFitWidth = NO;
    cCell.commentLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    cCell.commentLabel.font = [UIFont systemFontOfSize:13.0];
    cCell.commentLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cCell.commentLabel.numberOfLines = 0;
    [cCell.commentLabel sizeToFit];

}

谢谢!

2 个答案:

答案 0 :(得分:2)

由于您在故事板中执行此操作,因此可以在那里设置必要的标签属性(lineBreakMode和行数)。只需给标签一个特定的宽度约束和约束到单元格的顶部,底部和左侧。然后,在代码中使用sizeWithFont:constrainedToSize:lineBreakMode:在heightForRowAtIndexPath中:根据标签的内容计算单元格的适当高度 - 由于其约束,标签将随着单元格扩展到适当的大小。像这样:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize rowSize = [self.theData[indexPath.row] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(260, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    return rowSize.height + 30;
}

这里,260是我在IB中给出我的标签的宽度,而30是一个软糖因子(根据经验确定)以考虑标签上方和下方的填充。

答案 1 :(得分:-1)

我遇到了同样的问题。取消选中Autolayout可以修复它。