复杂单元格的动态UITableViewCell高度

时间:2013-04-22 09:53:11

标签: ios dynamic uitableview

我正在尝试在UITableView中计算单元格的动态高度。

我的细胞非常复杂:它可能是十几个标签,uitextfield,按钮等。事实上,它就像一个单元格中的一个表单(使用de UITableViewGroupedStyle,它看起来就像一个表单!)。所以我不关心“sizeWithFont:withConstrainedSize:etc ......”

我的单元格中有一个自定义类方法,用于计算单元格的高度(从内部组件的高度开始)。

现在在我的UITableViewController中,我想为我的单元格设置正确的高度。要做到这一点,我需要在我的手机上调用getHeight。但是......如果我在“heightForRowAtIndexPath”中调用“cellForRowAtIndexPath”,它会循环(因为cellForRow ...需要heightForRow ....来构建一个单元格。)

我还尝试在我的cellForRowAtIndexPath中构建单元格,获取其高度并将其存储在数组中以在heigtForRowAtIndexPath中检索它。因为“heightForRowAtIndexPath”被称为BEFORE“cellForRow ...”,所以我第一次返回默认值(CGFLOAT_MAX)。构建我的单元格后,我将返回从数组中检索到的高度。但是第二次调用它,我需要手动调用它,所以当我的单元格构建在“CellForRow ...”时,我调用reloadData。但是......(一次又一次)它无论如何都不起作用......实际上,有时候它有效(使用UITableViewGroupedStyle)有时没有(使用UITableViewPlainStyle,因为它像CGFLOAT_MAX默认值一样......)

这让我发疯了!

此版本适用于UITableViewGroupedStyle:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MFFormListCell *cell = [self.cellSizeMap objectForKey:indexPath];
    return cell;

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    MFFormListCell *cell = [self.cellSizeMap objectForKey:indexPath];
    if(!cell || ![cell isEqual:[NSNull null]]) {
        [self.cellSizeMap setObject:[NSNull null] forKey:indexPath];
        cell = [tableView dequeueReusableCellWithIdentifier:@"FormListCell" forIndexPath:indexPath];
        [self.cellSizeMap setObject:cell forKey:indexPath];
    }


    if([cell isEqual:[NSNull null]])
        return CGFLOAT_MAX;     //Valeur max pour que le système prennent en compte toutes les cellules à afficher
    else
        return [[cell getHeight] floatValue];


}

不要在“heightForRowAtIndexPath:”中询问第一个“if”,这是避免循环的一个坏方法。

1 个答案:

答案 0 :(得分:0)

您的表数据源应该知道单元格的高度,而不是您的单元格。根据将要显示的内容计算视图控制器中每个单元格的高度,并将它们存储在数组中。重新加载表时,只需返回相应索引处数组中先前计算高度的索引。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     return [_cellHeights objectAtIndex:indexPath.row];
}