使用几种不同类型的单元格滚动 UITableView 不够平滑

Scrolling UITableView with few different types of cells not smooth enough

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

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

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

您可能是对的,XIB 的初始加载正在杀死您。

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

可以通过在 InterfaceBuilder 中将每个视图(标签、按钮、视图)设置为不透明来缓解部分速度下降。

减少 alpha != 1 的观看次数。

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

查看此人的解释和示例代码,了解他如何使非常动态的 tableView 的滚动速度达到应有的速度。 https://github.com/kevinlawler/fastscrolling

*link 是个老例子,但原则仍然适用 afaik

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

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

我用的是绝招

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

2) 随心所欲地出队。

3) 将 cell.clipToBounds 设置为是。

大功告成。