UITableView行高基于单元格内容

时间:2013-05-09 14:45:53

标签: ios ipad uitableview

我已经看过几个问题,要求根据细胞内容调整行高。但就我而言,我在一个单元格中有10个标签,每个标签都有固定的宽度。如果不符合标签宽度,标签必须包装文本。因此行高取决于所有10个标签的文本内容。这意味着我必须计算给定文本的每个标签的高度,并将所有标签中的最大高度作为行高。我必须为所有行执行此操作。这对我来说是一个不够的解决方案。有没有更好的解决方案?

谢谢,

Jignesh

2 个答案:

答案 0 :(得分:2)

您需要在显示单元格之前计算所有高度。 之后使用:

返回每行的行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

要计算文字大小,请使用:

[yourString sizeWithFont:constrainedToSize:lineBreakMode:]

答案 1 :(得分:1)

UITableView要求您实施heightForRowAtIndexPath以获得表格单元格的自定义高度。这是因为UITableView每次重新加载数据时都会计算表的总高度。如果数据是静态的,您可以查看行高度计算。

在您的情况下,我建议创建一个数据模型类,该类表示所有10个标签的文本值,并在该数据模型类上提供一个辅助函数,您可以在heightForRowAtIndexPath中调用该函数。辅助函数将封装行高度计算,如下所示:

假设您有一个表示行中数据的数据模型类:

@interface MyDataModelClass : NSObject

@property (strong, nonatomic) NSString *label1Text;
@property (strong, nonatomic) NSString *label2Text;
// ... etc

- (CGFloat)calculateLabelHeight;

@end

然后你的calculateLabelHeight方法可能看起来像这样(这显然只是伪代码):

- (CGFloat)calculateLabelHeight {

    CGFloat totalHeight = 0.0;

    // Loop through your label texts calculating the variable sized height for each 
    // and adding some padding in between:

   CGSize variableSize1 = [self.label1Text sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(300, 400) lineBreakMode:NSLineBreakByWordWrapping];

   CGSize variableSize2 = [self.label2Text sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(300, 400) lineBreakMode:NSLineBreakByWordWrapping];

    totalHeight = variableSize1 + padding + variableSize2 + padding; // and so on for all your labels.

    return totalHeight;
}

然后在heightForRowAtIndexPath中你可以这样做:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    MyDataModelClass *modelObject = [self.data objectAtIndex:indexPath.row];

    // Assuming model object's label text properties have been set you can do this:

    return modelObject.calculateLabelHeight;
}

我刚刚想到一个标签可能有一个长字符串,导致它包裹并可能覆盖第二个标签。您可能还希望在知道每个标签文本的高度后,将方法添加到名为UITableViewCell的{​​{1}}子类或为您执行此操作的方法。

不幸的是,我认为这是计算细胞高度的唯一方法。见S.O.发布更多信息:

IOS: dynamic height with a custom uitableviewcell