3

我需要在一个非常复杂的表格视图中包含几种不同的单元格类型。我在那些具有不同重用标识符的不同单元类中注册了 10 个 xib。问题是当我第一次(从上到下)滚动表格视图时,我可以看到它有点滞后。然而,在我滚动到底部之后,然后滚动回到顶部和底部再次运行顺利。问题似乎出在 dequeueReusableCellWithIdentifier: 如果目前没有所需类型的可重用单元格,它似乎在滚动时加载不同的 xib 文件的速度不够快。这就是第一次滚动滞后的原因,但是当加载了足够多的每种类型的可重用单元格时,它就会开始平滑滚动。

有没有办法为 UITableView 预加载可重用的单元格。因此,例如,我可以加载每种 xib 类型 3 次(因此当调用 dequeueReusableCellWithIdentifier 时,tableview 将在内存中加载 30 个可重复使用的单元格(10 种单元格类型中的每个单元格 3 个))?稍后我需要在应用商店上发布应用,因此不允许使用任何私有 api。或者,在这种情况下,您可能有任何其他可能的解决方案来提高性能?

4

4 回答 4

1

如果您在应用程序中使用故事板,则在将 tableView 的父视图控制器声明为 UITableViewDelegate 后,您可以在表定义中定义多个单元格类型。

您可能是对的,XIB 的初始负载正在杀死您。 在此处输入图像描述

于 2015-03-11T19:15:22.607 回答
1

我记得,CoreGraphics 将在每个单元格首次出现时遍历它并执行一些混合计算,以使标签和视图显示为您设计的那样。

可以通过在 InterfaceBuilder 中将每个视图(标签、按钮、视图)设置为不透明来缓解这种减速。

减少 alpha != 1 的视图数量。

将背景设置为白色,或者您使用的任何颜色,而不是清晰的。

查看这个人的解释和示例代码,了解他如何让动态表格视图尽可能快地滚动。https://github.com/kevinlawler/fastscrolling

*该链接是一个旧示例,但原则仍然适用于 afaik

于 2015-03-11T20:44:06.903 回答
1

使用预加载单元创建二级缓存解决了滚动问题。在 viewDidLoad 上,我正在注册笔尖(使用 registerNib:forCellReuseIdentifier:),之后也在 viewDidLoad 中创建一个可变数组,我使用 dequeueReusableCellWithIdentifier: 为每个笔尖加载几个单元格,然后将这些单元格放入我的可变数组中。稍后在 cellForRowAtIndexPath 中,我首先检查是否在可变数组中预加载了所需类型的单元格。如果我有它,那么我返回这个单元格并将其从数组中删除(在这种情况下,我不调用 dequeueReusableCellWithIdentifier:)。如果我的缓存中没有它,那么我调用 dequeueReusableCellWithIdentifier: 来获取单元格。

编辑:事实证明,滞后的主要原因是我在 awakeFromNib 中有一些简单的反应性可可绑定。移除这些反应性可可绑定后,即使没有任何额外的单元格预加载,一切都开始顺利滚动。

于 2015-03-19T10:00:42.597 回答
1

我正在使用一种技巧。

1)在实际的前面添加几个零高度单元格。

2)根据您的需要将其出列。

3) 将 cell.clipToBounds 设置为 YES。

现在它完成了。

于 2016-02-16T04:38:46.727 回答