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