我想学习一种常用且正确的自定义单元高度计算方法 我的细胞从笔尖加载,它们有两个多线UILabel,一个在另一个之上 目前,我在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文件加载Cell Label的样式(如屏幕边框的字体和偏移量)(单元格在nib内)。
添加了cell的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.简单的代码,但不是很漂亮。
答案 0 :(得分:1)
您似乎正在尝试在heightForRowAtIndexPath
内创建子视图。视图创建应该在cellForRowAtIndexPath
中完成。
根据您的实施,您只能确定细胞布局后的高度。这并不好,因为 UITableView会在数据重新加载时为每个单元调用heightForRowAtIndexPath
,而不仅仅是可见的。因此,即使不需要显示所有单元格的子视图,也会创建它们。
要优化此实现,您必须制定某种公式,以便在不布置视图的情况下确定高度。即使您的布局是弹性的或具有可变高度,给定文本矩形,您仍然可以确定其高度。使用[NSString sizeWithFont:]
确定其显示的矩形。将此信息记录在数据委托中。调用heightForRowAtIndexPath
时,请直接返回。