UICollectionview 使用 CALayer 和 CATextlayer 滚动效果不佳

Posted

技术标签:

【中文标题】UICollectionview 使用 CALayer 和 CATextlayer 滚动效果不佳【英文标题】:UICollectionview poor scrolling with CALayer and CATextlayer 【发布时间】:2013-09-17 16:19:12 【问题描述】:

我有一个集合视图,可以说大约 50 个对象,每个对象都有基于其类别的三个图像之一(没关系),每个对象(变成一个单元格)也有两个 CATextLayer 对象和一个徽标(每个单元格有一个独特的标志)。

我创建了一个包含所有上述参数的可重用单元格 - 类别图像分配给单元格 contentView.layer,徽标是一个 calayer(我在第一次创建单元格时创建它,然后只需更改它的值- 而不是每次调用 cellforitematindexpath 时都添加一个 calayer)并通过相同的技术更改不同单元格的 cattextlayer(基于数据源对象信息)。

一切正常,但在 iPhone 4 上滚动非常慢,我想那是因为对于每个被调用的单元格,我都去获取徽标(位于目录中)。当视图加载时,基于类别的图像被实例化为一个层(所以我不需要在调用单元格时获取它们) - 这更快但是我可以用徽标做什么?我无法初始化 50 张图像并让它们吃掉我所有的记忆。

我有一个可以导致快速平滑滚动的解决方案 - 初始化用户在集合视图中看到的第一个对象,并仅在没有拖动或减速时加载单元格参数 - 而不是使用 uicollectionview.visiblecells 到哪个单元格我需要加载。

但我不希望这样 - 我希望用户滚动并查看所有单元格参数 而不是一个activityIndi​​cator。

你有其他方法吗?

顺便说一句 我曾经使用 UIKIt 来完成所有这些工作,但我转而使用 Core Animation,因为我觉得它会更快。

tnx.

【问题讨论】:

使用仪器。其他一切都是猜测。核心动画工具可能有助于查看它是否与渲染相关。否则,时间探查器擅长识别瓶颈。 与 CALayers 相比,UIKit 有一些额外的成本,但并不大。通常,UIKit 围绕标准情况进行了优化,这可以提供比操作自己的图层更好的性能。正如@DavidRönnqvist 所说,分析是您的最佳选择。 【参考方案1】:

请参阅 WWDC 2012 视频 ios App Performance: Responsiveness 和 iOS App Performance: Graphics and Animations,了解有关如何使用 Instruments 来识别问题的一些教程。

如果您还没有这样做,我将着手使图像检索过程异步。此外,如果您的图像很大/即在调整大小时,您可能希望保存/使用调整后的大小/缩略图再现,这可以提高性能。之前的视频甚至谈到了用图像快照替换繁忙的UICollectionView 上的一组复杂标签的想法。

但是,正如 David 所说,在您通过时间分析器运行它之前,我们只是在猜测。为了解释苹果在那些 WWDC 视频中使用的工作流程,你必须使用工具来量化/识别确切的问题,形成假设,在投入太多时间在解决方案之前快速测试该假设,如果假设经得起审查,只有这样才能深入实施解决方案。

【讨论】:

【参考方案2】:

有一个库可以在后台加载图像。它遵循延迟加载的概念。如果您使用它,您的应用会顺畅滚动。

在下面的库中有“EGOImageView”。使用此类代替 ImageView 并将图像路径设置为“ImageURL”属性

EGOImageLoading

如果您在其中找不到 EGOCache 文件,请从以下链接下载这些文件

EGOCache

问候,

萨提亚

【讨论】:

以上是关于UICollectionview 使用 CALayer 和 CATextlayer 滚动效果不佳的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView介绍使用

iOS Core Animation之CALayer心得

使用 NSFetchResultsController 时 UICollectionView 滚动不流畅

如何防止使用 UICollectionView 滚动 UIScrollView

iOS 使用 PullToRefreshView 使 UICollectionView 可滚动

如何使用 UICollectionView 创建 3 列