Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 绘制动态UITableView行高的最佳实践_Iphone_Objective C_Ios_Uitableview - Fatal编程技术网

Iphone 绘制动态UITableView行高的最佳实践

Iphone 绘制动态UITableView行高的最佳实践,iphone,objective-c,ios,uitableview,Iphone,Objective C,Ios,Uitableview,可能是重复的,但我找不到具体的问题,所以在这里 我对动态更改所有行的高度感到好奇,通常是因为您不知道用于标签的NSString的长度 我知道您必须使用此委托方法来更改行高度: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 问题是在创建单元格之前调用此委托方法(即在cellforrowatinexpath之前调用) 因此,我想到的是在视图中创建一个模拟单

可能是重复的,但我找不到具体的问题,所以在这里

我对动态更改所有行的高度感到好奇,通常是因为您不知道用于标签的NSString的长度

我知道您必须使用此委托方法来更改行高度:

- (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

太糟糕了。我也希望得到更多的回应。谢谢你的意见!