我想学习一种通用且正确的自定义单元格高度计算方法。
我的单元格是从 nib 加载的,它们有两个多行 UILabels,一个在另一个之上。
目前,我在 viewDidLoad 中创建特殊配置单元格,并在 heightForRowAtIndexPath 中使用它。
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
[self configureCell:self.configurationCell forIndexPath:indexPath];
CGRect configFrame = self.configurationCell.frame;
configFrame.size.width = self.view.frame.size.width;
self.configurationCell.frame = configFrame;
[self.configurationCell layoutSubviews];
UILabel *label = (UILabel *)[self.configurationCell viewWithTag:2];
float height = label.frame.origin.y + label.frame.size.height + 10;
return height;
}
它有效,但似乎是一种不礼貌的方式。我认为必须为每个项目和每个方向预先计算高度。但我找不到使它变得漂亮和直接的方法。
你能帮帮我吗?
单元格标签的样式(如字体和屏幕边框的偏移量)必须从 nib 文件加载(单元格在 nib 内)。
添加单元格的 layourSubviews 方法:
-(void) layoutSubviews {
[super layoutSubviews];
[self.shortDescriptionLabel resize];
CGRect longDescriptionFrame = self.longDescriptionLabel.frame;
longDescriptionFrame.origin.y = self.shortDescriptionLabel.frame.origin.y + self.shortDescriptionLabel.frame.size.height + 5;
self.longDescriptionLabel.frame = longDescriptionFrame;
[self.longDescriptionLabel resize];
}
标签的调整大小方法只是增加它的高度以适应所有文本。所以单元格的高度计算为longDescriptionLabel.bottom + 10。代码简单但不是很漂亮。
最佳答案
看来您正在尝试在 heightForRowAtIndexPath
中创建 subview 。 View 创建应该在 cellForRowAtIndexPath
中完成。
根据您的实现,您只能在布局后确定单元格的高度。这并不好,因为 UITableView 在数据重新加载时为每个单元格调用 heightForRowAtIndexPath
,而不仅仅是可见单元格。因此,即使不需要可见,也会创建所有单元格的 subview 。
要优化此实现,您必须计算出某种公式以允许在不布置 View 的情况下确定高度。即使您的布局是弹性的或具有可变高度,给定文本矩形,您仍然可以确定其高度。使用 [NSString sizeWithFont:]
确定其显示的矩形。在您的数据委托(delegate)中记录此信息。调用heightForRowAtIndexPath
时,直接返回。
关于iOS heightForRowAtIndexPath 正确计算方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928033/