如何正确地在iPhone上进行可变高度的表格单元格?

Jas*_*ien 22 iphone uitableview

我的应用程序需要具有可变高度表格单元格(因为每个表格单元格的高度不同,而不是每个单元格都需要能够自行调整大小).

我有一个目前有效的解决方案,但它很笨拙而且很慢.

我目前的解决方案

在呈现表格单元格之前,我通过调用诸如-sizeWithFont:constrainedToSize:其数据之类的大小调整方法来计算每个单元格需要多高.然后我将高度加起来,允许一些填充并将结果与​​数据一起存储.

然后,当我的UITableViewDelegate接收到-tableview:heightForRowAtIndexPath:我的工作时,将为该单元格呈现哪个项目并返回我之前计算的高度.

正如我所说,这是有效的,但是-sizeWithFont:constrainedToSize:当你按顺序对数百个项目进行调用时调用非常慢,我觉得它可以做得更好.

因此,为了实现这一点,我必须维护两部分代码 - 一部分用于计算单元格高度,另一部分用于在时间到来时实际绘制单元格.

如果关于模型项的任何更改,我必须更新这两个代码块,并且现在又一次它们仍然不能完美匹配,有时会导致表格单元格对于给定项目而言略微过小,或者也是如此大.

我建议的解决方案:

所以我想取消预先计算细胞高度.A)因为它打破了MVC范式而B)因为它很慢.

因此,我的细胞自我吸收,因此,最终得到正确的细胞高度.我的问题是,我无法告诉桌子在绘制之前查看单元格的高度 - 到时为止已经太晚了.

我尝试-cellForRowAtIndexPath:从内部调用,-tableView:heightForRowAtIndexPath:但这会陷入无限循环,因为第一个在某个时刻调用第二个,反之亦然(至少这是我在尝试时看到的).

所以这个选项是不可能的.

如果我没有在行委托方法的高度中指定大小,那么表视图就变得棘手了.细胞是完美的高度,但它们的x位置是固定高度的细胞.

Messed Table Cells http://jamsoftonline.com/images/messed_table_cells.png

注意底部单元格的大小是正确的 - 它只是与前一个单元格重叠,而前一个单元格与之前的单元格重叠,依此类推.

同样使用这种方法,在滚动时会出现一些伪像,我认为这些伪像可能与单元格的重用标识符有关.

所以在这里的任何帮助将不胜感激.

DrA*_*oel 38

这是我使用的.NSString有一个方法,它将根据您给出的字体信息和高度/宽度约束告诉您文本框的尺寸.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *text = [self getTextForIndexPath:indexPath];
    UIFont *font = [UIFont systemFontOfSize:14];
    CGSize size = [self getSizeOfText:text withFont:font];

    return (size.height + 11); // I put some padding on it.
}
Run Code Online (Sandbox Code Playgroud)

然后你写一个方法拉这个单元格的文本...

- (NSString *)getTextForIndexPath:(NSIndexPath *)indexPath
{
    NSString *sectionHeader = [self.tableSections objectAtIndex:[indexPath section]];
    NSString *sectionContent = [self.tableData objectForKey:sectionHeader];

    return sectionContent;
}
Run Code Online (Sandbox Code Playgroud)

这是为了获得文本的大小.

- (CGSize)getSizeOfText:(NSString *)text withFont:(UIFont *)font
{
    return [text sizeWithFont:font constrainedToSize:CGSizeMake(280, 500)];
}
Run Code Online (Sandbox Code Playgroud)