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