iOS正确的heightForRowAtIndexPath计算方式

时间:2012-03-29 14:59:20

标签: ios uitableview

我想学习一种常用且正确的自定义单元高度计算方法 我的细胞从笔尖加载,它们有两个多线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.简单的代码,但不是很漂亮。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试在heightForRowAtIndexPath内创建子视图。视图创建应该在cellForRowAtIndexPath中完成。

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

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