iOS用于RowAtIndexPath计算的正确高度方式

iOS用于RowAtIndexPath计算的正确高度方式,ios,uitableview,Ios,Uitableview,我想学习一种通用且正确的自定义单元格高度计算方法。 我的单元格是从nib加载的,它们有两个多行UILabel,一个在另一个之上。 目前,我在viewDidLoad中创建了特殊的配置单元,并在heightForRowAtIndexPath中使用它 -(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { [self configureCell:self.

我想学习一种通用且正确的自定义单元格高度计算方法。
我的单元格是从nib加载的,它们有两个多行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文件加载(单元格位于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。代码很简单,但不是很漂亮。

似乎您正在尝试在
高度为rowatinexpath
中创建子视图。视图创建应该在
cellforrowatinexpath
中完成

根据您的实现,您只能在布置单元后确定单元的高度。这是不好的,因为在数据重新加载时,UITableView为每个单元格调用
heightforrowatinexpath
,而不仅仅是可见的单元格。因此,即使不要求所有单元的子视图可见,也会创建它们


要优化此实现,必须计算某种公式,以便在不布局视图的情况下确定高度。即使您的布局是弹性的或具有可变高度,给定文本矩形,您仍然可以确定其高度。使用
[NSString sizeWithFont:][/code>确定其显示的矩形。在数据代理中记录此信息。调用
heightforrowatinexpath
时,直接返回它。

似乎您正试图在
heightforrowatinexpath
内创建子视图。视图创建应该在
cellforrowatinexpath
中完成

根据您的实现,您只能在布置单元后确定单元的高度。这是不好的,因为在数据重新加载时,UITableView为每个单元格调用
heightforrowatinexpath
,而不仅仅是可见的单元格。因此,即使不要求所有单元的子视图可见,也会创建它们


要优化此实现,必须计算某种公式,以便在不布局视图的情况下确定高度。即使您的布局是弹性的或具有可变高度,给定文本矩形,您仍然可以确定其高度。使用
[NSString sizeWithFont:][/code>确定其显示的矩形。在数据代理中记录此信息。调用
heightforrowatinexpath
时,直接返回它。

我没有在heightforrowatinexpath中创建任何内容。我只需设置文本并调用单元格视图的布局。此配置单元从viewDidLoad的nib文件创建一次。所以你错了-heightForRowAtIndexPath中没有创建视图。我想找一个简单的方法来计算。在控制器中获取单元格的字体大小和尺寸对我来说太复杂了。您没有为
layoutSubviews
提供任何内容,所以这对我来说是一个黑匣子。尽管如此,我的建议仍然有效。您不应该在
heightforrowatinexpath
中执行任何复杂的操作,因为它是为每一行调用的。我说的是在哪里安排你的视野的最佳选择。若你们觉得它太复杂,那个么你们就不需要这个优化了。我在我的帖子中添加了layoutSubviews方法。这并不像你看到的那么复杂。我应该用高度预计算来代替这个简单的方法吗?我可以看出它并没有那么复杂。但是你不认为仅仅为了高度而布局视图是没有必要的吗?你的方法行得通,但效率不高。由于电池有限,移动应用程序往往能节省每一点CPU。因此,我们通常尝试找出如何预计算和缓存高度。因此,它可以在异步块中完成,而不是在UI线程中完成。如果有很多单元格,您的方法可能会觉得加载缓慢。我不会在heightForRowAtIndexPath中创建任何内容。我只需设置文本并调用单元格视图的布局。此配置单元从viewDidLoad的nib文件创建一次。所以你错了-heightForRowAtIndexPath中没有创建视图。我想找一个简单的方法来计算。在控制器中获取单元格的字体大小和尺寸对我来说太复杂了。您没有为
layoutSubviews
提供任何内容,所以这对我来说是一个黑匣子。尽管如此,我的建议仍然有效。您不应该在
heightforrowatinexpath
中执行任何复杂的操作,因为它是为每一行调用的。我说的是在哪里安排你的视野的最佳选择。若你们觉得它太复杂,那个么你们就不需要这个优化了。我在我的帖子中添加了layoutSubviews方法。这并不像你看到的那么复杂。我应该用高度预计算来代替这个简单的方法吗?我可以看出它并没有那么复杂。但是你不认为仅仅为了高度而布局视图是没有必要的吗?你的方法行得通,但效率不高。由于电池有限,移动应用程序往往能节省每一点CPU。因此,我们通常尝试找出如何预计算和缓存高度。因此,它可以在异步块中完成,而不是在UI线程中完成。如果有很多单元格,您的方法可能会觉得加载缓慢。