使用几种不同类型的单元滚动UITableView不够流畅

时间:2015-03-11 18:53:35

标签: ios performance uitableview reuseidentifier

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

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

4 个答案:

答案 0 :(得分:1)

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

你可能正确的是,XIB的初始加载正在扼杀你。 enter image description here

答案 1 :(得分:1)

我记得,CoreGraphics将首先显示每个单元格并执行一些混合计算,以便在设计标签和视图时显示它们。

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

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

将背景设置为白色或您正在使用的任何颜色而不是清除。

查看这个人的解释和示例代码,了解他如何以非常动态的tableViews进行滚动。 https://github.com/kevinlawler/fastscrolling

*链接是一个古老的例子,但原则仍然适用于

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

我使用技巧方式。

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

2)将其排队为你想要的东西。

3)将cell.clipToBounds设置为YES。

现在已经完成了。