在性能问题之前调用UITableView中所有行和多less行的heightForRowAtIndexPath?

我以为我读了一个UITableView heightForRowAtIndexPath不会被所有行调用,但只有那些将是可见的。 这不是我所看到的。 例如,我看到数百个针对iPhone的方向被改变的简单情况的heightForRowAtIndexPath调用。

所以我在这里假设,因此,对于一个UITableViewheightForRowAtIndexPath实现,它((即heightForRowAtIndexPath )被调用的所有行(不只是可见的)…让我知道如果这是不正确的。

问题:鉴于上述情况,通常会出现性能问题之前, UITableView中有多less行(其中实现了heightForRowAtIndexPath )?

有没有解决性能问题的方法? 即设置一个名义/标准高度的每一行,而不是实现heightForRowAtIndexPath ,但然后正确地设置每个行的高度,只有当它被显示,并在这里设置正确…但是哪种方法可以做到这一点?

看看tableView:heightForRowAtIndexPath:文档中的讨论部分

该方法允许委托指定具有不同高度的行。 如果实现此方法,则返回的值将覆盖为给定行的UITableView的rowHeight属性指定的值。

有使用tableView:heightForRowAtIndexPath:而不是rowHeight属性的性能影响 。 每次显示表视图时,都会调用tableView:heightForRowAtIndexPath:在每个行的委托上,这可能会导致具有大量行(大约1000或更多)的表视图出现严重的性能问题。

所以你应该使用UITableView的rowHeight属性。 如果你需要不同的高度,你是不幸的,因为你必须使用tableView:heightForRowAtIndexPath:

AFAIK没有办法改变显示行高。
桌面必须知道正确的大小之前,否则会一直有难看的位置转换。

我想我find了一个解决scheme。

在iOS 7中,苹果引入了一些新的tableview属性。 其中之一是:

 tableView:estimatedHeightForRowAtIndexPath: 

因此,例如,如果提供估计的行高度,则在显示表之前重复调用tableView:heightForRowAtIndexPath:时,仅调用表的可见单元格; 对于剩余的单元格,使用估计的高度。

以下是此信息的来源: https : //books.google.gr/books?id=wLaVBQAAQBAJ&pg=PT521&lpg=PT521&dq=heightforrowatindexpath+only+ for+the+ visible+cells& source =bl&ots=7tuwaMT5zV&sig=h3q8AaFvoCgcrPu2fQchVkIEjwg&hl=zh-CN&sa=X&ved= 0CEMQ6AEwBWoVChMInLK0xbPuxwIVCbUaCh3_nQWG#v = onepage&q = heightforrowatindexpath%20only%20for%第二十条%20visible%20cells&F =假

一个方法来提高大量的行和dynamic单元格高度tableViews中的性能caching单元格的高度,一旦他们第一次计算。

一个简单的方法来实现这一点是保持一个NSMutableDictionary ,其中的关键是单元格中的logging的ID(或任何其他的标识符),并且该值是一个NSNumber与该行的高度。 首先计算高度后,按照loggingID存储NSMutableDictionary 。 在tableView:heightForRowAtIndexPathtableView:estimatedHeightForRowAtIndexPath:检查字典中的caching高度,如果find则返回。 如果没有find,计算高度,并在返回高度之前存储在caching中。

您可能必须小心无效高速caching行高度。 例如,如果在一个单元格中有一个展开button,则一旦展开button被轻敲,调用委托方法调用高度,就需要从caching中删除该单元格的高度。

如果您在表格显示时尝试一次显示1000个单元格,您可能仍会遇到性能问题,因为它可能会调用每行的高度方法。 解决这个问题的方法是在首先显示单元格之前,首先加热caching,如果可能的话在后台任务中。

我的天啊,我花了一个多小时试图find我的performance问题的来源!

最后,我还发现了数百个对heightForRowAtIndexPath的调用,search让我这个线程。 这真的很烦人。 当只显示250个项目时,性能就下降了。 谢天谢地,我现在要显示的单元格都具有相同的大小。 但我可以想象有人希望显示一个不同的单元格为一个tableView> 200项目!

修正这个苹果!

干杯