我正在尝试计算 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”,这是避免循环的坏技巧。