我正在尝试在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”,这是避免循环的一个坏方法。
答案 0 :(得分:0)
您的表数据源应该知道单元格的高度,而不是您的单元格。根据将要显示的内容计算视图控制器中每个单元格的高度,并将它们存储在数组中。重新加载表时,只需返回相应索引处数组中先前计算高度的索引。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [_cellHeights objectAtIndex:indexPath.row];
}