Ios UITableView基于单元格内容的行高

Ios UITableView基于单元格内容的行高,ios,ipad,uitableview,Ios,Ipad,Uitableview,我已经看了几个关于根据单元格内容调整行高的问题。但在我的例子中,一个单元格中有10个标签,每个标签都有固定的宽度。如果不适合标签宽度,标签必须包裹文本。因此,行高取决于所有10个标签的文本内容。这意味着我必须计算给定文本的每个标签的高度,并将所有标签中的最大高度作为行高。我必须对所有行执行此操作。在我看来,这是一个不充分的解决办法。有没有更好的解决办法 谢谢 Jignesh在显示单元格之前,需要计算所有高度。 之后,使用以下公式返回每行的行高: - (CGFloat)tableView:(UIT

我已经看了几个关于根据单元格内容调整行高的问题。但在我的例子中,一个单元格中有10个标签,每个标签都有固定的宽度。如果不适合标签宽度,标签必须包裹文本。因此,行高取决于所有10个标签的文本内容。这意味着我必须计算给定文本的每个标签的高度,并将所有标签中的最大高度作为行高。我必须对所有行执行此操作。在我看来,这是一个不充分的解决办法。有没有更好的解决办法

谢谢


Jignesh

在显示单元格之前,需要计算所有高度。 之后,使用以下公式返回每行的行高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
要计算文本大小,请使用:

[yourString sizeWithFont:constrainedToSize:lineBreakMode:]

在显示单元格之前,需要计算所有高度。 之后,使用以下公式返回每行的行高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
要计算文本大小,请使用:

[yourString sizeWithFont:constrainedToSize:lineBreakMode:]

UITableView
要求您实现
heightforrowatinexpath
,以便为表格单元格设置自定义高度。这是因为每次重新加载数据时,
UITableView
计算表的总高度。如果数据是静态的,也可以缓存行高计算

在您的情况下,我建议创建一个数据模型类,该类表示所有10个label的文本,并在该数据模型类上提供一个helper函数,您可以在
heightforrowatinexpath
中调用该函数。helper函数将封装行高计算,可能类似于以下内容:

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

@interface MyDataModelClass : NSObject

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

- (CGFloat)calculateLabelHeight;

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

然后在
heightforrowatinexpath
中,可以执行以下操作:

- (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;
}
我突然想到,一个标签可能有一个长字符串,导致它包装,并可能覆盖第二个标签。您可能还想向名为
reposetlabels
UITableViewCell
子类添加一个方法,或者在知道每个标签文本的高度后为您添加此方法

不幸的是,我认为这是计算单元高度的唯一方法。有关更多信息,请参阅本S.O.帖子:


UITableView要求您实现
行高度索引路径
,以便为表格单元格设置自定义高度。这是因为每次重新加载数据时,
UITableView
计算表的总高度。如果数据是静态的,也可以缓存行高计算

在您的情况下,我建议创建一个数据模型类,该类表示所有10个label的文本,并在该数据模型类上提供一个helper函数,您可以在
heightforrowatinexpath
中调用该函数。helper函数将封装行高计算,可能类似于以下内容:

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

@interface MyDataModelClass : NSObject

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

- (CGFloat)calculateLabelHeight;

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

然后在
heightforrowatinexpath
中,可以执行以下操作:

- (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;
}
我突然想到,一个标签可能有一个长字符串,导致它包装,并可能覆盖第二个标签。您可能还想向名为
reposetlabels
UITableViewCell
子类添加一个方法,或者在知道每个标签文本的高度后为您添加此方法

不幸的是,我认为这是计算单元高度的唯一方法。有关更多信息,请参阅本S.O.帖子:


你好,伊戈尔,谢谢你的回复!!我知道,但我只是想找到更好的方法…为什么一个单元格需要10个标签?也许你需要用核心文本来代替?也可能有用。我正在iPad上实现gridview,所以10只是一个例子,它可以是任意数量的列,因此单元格中可以有任意数量的标签…嗨,Igor,谢谢你的回复!!我知道,但我只是想找到更好的方法…为什么一个单元格需要10个标签?也许你需要用核心文本来代替?也可能有用。我正在iPad上实现gridview,所以10只是一个例子,它可以是任意数量的列,因此单元格中可以有任意数量的标签……我认为模型对象不应该返回与视图相关的值。我会把代码移到控制器上,我不认为模型对象应该返回与视图相关的值。我会把代码移到控制器上。