我有一个 UITableView 单元格,它将根据其内容(可能是几行文本)具有可变大小。
因为在我布局单元格之前似乎调用了 heightForRowAtIndexPath ,我只是通过在我的文本字符串上调用 [NSString sizeWithFont] 来猜测正确的高度。在我在单元格中布置文本并知道它应该是什么大小之后,有没有更好的方法来设置高度?
我有一个 UITableView 单元格,它将根据其内容(可能是几行文本)具有可变大小。
因为在我布局单元格之前似乎调用了 heightForRowAtIndexPath ,我只是通过在我的文本字符串上调用 [NSString sizeWithFont] 来猜测正确的高度。在我在单元格中布置文本并知道它应该是什么大小之后,有没有更好的方法来设置高度?
这听起来很愚蠢,但是......呃......“在你退出 heightForRowAtIndexPath 之前布局你的单元格”;)
不过说真的——操作系统只在需要时才调用它(例如:它即将创建单元格并将其显示在屏幕上),因此将其布置并准备好显示不会浪费精力。
请注意,您不必在逻辑上单独进行布局。只需在 heightForRowAtIndexPath 例程中调用 [self prepLayoutForCellAtIndex:index] 即可。
如果数据是静态的,您可以创建一个高度表并缓存信息。
if (0 == heightTable[index]) {
heightTable[index] = [self prepLayoutForCellAtIndex:index];
}
return (heightTable[index]);
哎呀,即使数据发生变化,您也可以在更改数据的方法中重新计算表值,或者清除为 0,以便下次需要时重新计算。
我通常使用以下内容:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath {
UITableViewCell *cell = [self tableView: tableView cellForRowAtIndexPath: indexPath];
return cell.bounds.size.height;
}
请注意,我将它用于预先缓存一堆行的表,而不是用于具有大量单元格的表。但是,对于像设置表这样只有几行但很可能大小不同的东西,它运行良好。对于较大的桌子,我会按照 Olie 的建议做一些事情。
如果您以 SMS.app 为例,Apple 会将单元格的行高保存在 SMS.app sqlite 数据库中。