高度forrowatIndExpath被要求用于所有行,并且在绩效问题之前有多少行?
-
25-10-2019 - |
题
我以为我已经读过 UITableView
那 heightForRowAtIndexPath
不会被所有行打电话,而只能在将可见的行中召唤。但是,这不是我看到的。我看到数百个电话 heightForRowAtIndexPath
例如,对于更改iPhone的方向的简单情况。
所以我在这里假设 UITableView
和 heightForRowAtIndexPath
实施,它确实(即 heightForRowAtIndexPath
)被打电话给所有行(不仅是可见的行)...让我知道这是否不正确。
问题:给定上述,一排 UITableView
(在哪里 heightForRowAtIndexPath
是否实现)您可以在通常发生绩效问题之前拥有吗?
有办法解决绩效问题吗? IE为每一行设置标称/标准高度,而不是实现 heightForRowAtIndexPath
, ,但是仅在显示每个行高并在此处正确设置时正确设置每个行高的高度...但是哪种方法可以这样做?
解决方案
查看讨论部分 tableView:heightForRowAtIndexPath:
文档
该方法允许委托指定高度不同的行。如果实现了此方法,则其返回的值将覆盖给定行的UaiteDview的RowHeight属性指定的值。
对使用TableView的性能含义:Height ForrowatIndExpath:而不是RowHeight属性. 。每次显示表视图时,都会调用表观视图:高度forrowatIndExpath:在其每个行的代表上,这可能会导致一个重大的性能问题,而表视图具有大量行(约1000或更多)。
因此,您应该使用 rowHeight
uitableview的属性。如果您需要不同的高度,您不得不使用,因为您必须使用 tableView:heightForRowAtIndexPath:
.
AFAIK无法更改显示时的行高。
表观视图必须知道以前的正确尺寸,Otherwise的位置将一直在移动。
其他提示
我想我找到了解决方案。
在iOS 7中,Apple推出了一些新的TableView属性。其中之一是:
tableView:estimatedHeightForRowAtIndexPath:
因此,如果您提供估计的行高度,例如,当tableview:heightforrowatIndIndExpath:在显示表格之前重复调用时,仅适用于表的可见单元格;对于其余细胞,使用估计的高度。
我的天哪,我花了一个多小时试图找到我的性能问题的根源!
最终,我还发现了数百个呼叫高度的呼叫ForrowatIndExpath,搜索使我这个线程。那真的很烦人。当仅显示250个项目时,性能就已经下降了。值得庆幸的是,我现在要显示的单元格具有相同的大小。但是我可以想象有人想为带有200个项目的桌面显示一些不同的单元格!
修复这个苹果!
干杯
提高大量行和动态单元格高的表观视图中性能的一种方法是,一旦计算出细胞的高度。
实现这一目标的一种简单方法是保持 NSMutableDictionary
其中关键是单元格中记录的ID(或您可能拥有的任何其他标识符),该值是一个 NSNumber
与行高度。首先计算高度后,将其存储 NSMutableDictionary
通过记录ID。在里面 tableView:heightForRowAtIndexPath
和 tableView:estimatedHeightForRowAtIndexPath:
您检查字典中是否有缓存的高度,并在发现时退回。如果找不到,请在返回高度之前计算高度并存储在缓存中。
对于改变高度的行,您可能必须小心地使其无效。例如,如果您的一个单元格中有一个展开按钮,则一旦调用了“扩展”按钮的高度方法,就需要从缓存中删除该单元格的高度。
如果您尝试在表显示时尝试一次显示1000个单元格,则可能仍会受到性能的打击,因为它可能会调用每一行的高度方法。为此,在首先显示单元格之前,请首先在后台任务中加热缓存。