Iphone 绘制动态UITableView行高的最佳实践
可能是重复的,但我找不到具体的问题,所以在这里 我对动态更改所有行的高度感到好奇,通常是因为您不知道用于标签的NSString的长度 我知道您必须使用此委托方法来更改行高度:Iphone 绘制动态UITableView行高的最佳实践,iphone,objective-c,ios,uitableview,Iphone,Objective C,Ios,Uitableview,可能是重复的,但我找不到具体的问题,所以在这里 我对动态更改所有行的高度感到好奇,通常是因为您不知道用于标签的NSString的长度 我知道您必须使用此委托方法来更改行高度: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 问题是在创建单元格之前调用此委托方法(即在cellforrowatinexpath之前调用) 因此,我想到的是在视图中创建一个模拟单
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
问题是在创建单元格之前调用此委托方法(即在cellforrowatinexpath
之前调用)
因此,我想到的是在视图中创建一个模拟单元格,并创建一个方法,将单元格高度添加到映射到表视图数据源(在我的示例中也是一个数组)的数组中
视图将出现
实现获取高度的一个重要方法:
[NSString sizeWithFont:constrainedToSize:lineBreakMode::
然后在heightforrowatinexpath
中,我可以返回单元格高度,如下所示:
//cellHeights is an ivar populated in viewWillAppear
return [[cellHeights objectAtIndex:indexPath.row] floatValue];
我想知道是否有更好的方法动态更改行高度
我意识到这将降低大量行的性能(我相信超过1000行)。但就我而言,我的排数永远不会接近这个数字。因此,对性能的影响可以忽略不计
提前谢谢 好问题!事实上,我在一些应用程序中也做了类似的事情
我可以想出几个备选方案,但所有这些都是同一主题。您也可以只使用sizeWithFont:
内部的heightForRowAtIndexPath:
并删除该数组。在这种情况下,如果每次重新计算大小的操作成本很高,则可能会导致性能下降
您可以在heightforrowatinexpath:
中对cellHeights数组执行“延迟加载”,因此它可能看起来像这样:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cellHeights objectAtIndex:indexPath.row] == nil) {
... calculate height and store it in the array at the correct index...
}
return [[cellHeights objectAtIndex:indexPath.row] floatValue];
}
我在这里考虑的优点是,您将只计算肯定要加载的单元的高度。如果您在视图中进行计算,则会出现,我猜您最终会对每个单元格进行计算,而不管它是否显示
最后,您可以将大小放入数据模型本身。例如,如果它是一个字符串数组,则可以创建一个具有两个属性的类:一个字符串和一个“representationSize”属性。然后,每次更改字符串的值时,都可以重新计算字符串的大小。然后,只有一个数组,而不是两个,映射到您的数据源上,填充了一个包含字符串和字符串显示大小的数据类,并且值将在字符串更改时计算,而不是在视图出现时一次计算
无论如何,我很想听到一些关于这些不同方法的评论。马修将高度放在数据模型中的想法听起来很有趣。这里有另一个答案提出了一个非常类似的解决方案:当我滚动tableview(在3gs iPhone上)时,我的UITableView有太多问题。我看到了很多滞后现象。所以我打开了时间分析器(非常好的优化工具),问题是当我调用函数sizeWithFont时。解决此问题的最佳解决方案是在构造函数中调用sizeWithFont 太糟糕了。我也希望得到更多的回应。谢谢你的意见!