-1

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

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

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

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

我还尝试在我的 cellForRowAtIndexPath 中构建单元,获取它的高度并将其存储在一个数组中以在 heigtForRowAtIndexPath 中检索它。因为“heightForRowAtIndexPath”在“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”,这是避免循环的坏技巧。

4

1 回答 1

0

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

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     return [_cellHeights objectAtIndex:indexPath.row];
}
于 2013-04-22T10:10:35.270 回答