向 UIScrollview 添加/删除 UIView 时的滞后来源?

Posted

技术标签:

【中文标题】向 UIScrollview 添加/删除 UIView 时的滞后来源?【英文标题】:Source of lag when adding/removing UIViews to UIScrollview? 【发布时间】:2012-07-17 23:21:45 【问题描述】:

问题:

UIScrollView 中添加/删除subviews 会导致明显的延迟。

详情:

我有一个UIScrollView(带有分页enabled),其中包含几十个“页面”。这个UIScrollview的内容大小是页数*UIScrollView的宽度。

这些页面中的每一个都是一个subview,我通过一些文件系统访问来构建它。我的UIScrollView 保留了三个页面作为subviews:当前页面及其左/右邻居。加载/驱逐相邻的subviews 发生在当前页面半离屏时,即磁盘访问和视图层次结构操作发生的时候。

当我第一次遇到这个问题时,我的直接想法是磁盘访问/构建subview 是滞后的根源。从那以后,我搬到了NSTimer,并且仍然遇到同样的延迟。

我开始怀疑延迟是由addSubview(将subview 添加到UIScrollView)和removeFromSuperview(从UIScrollView 中删除subviews)引起的。

Subviews 直接添加到UIScrollView。我在 UIScrollView 中没有添加它们的“内容视图”。

问题:

这是一个常见问题/瓶颈吗?有没有更好的加载这些页面的模式?

【问题讨论】:

如果您添加的子视图包含大型资源文件(图像),那么您可能会注意到延迟,因为图像根据图像的大小加载到内存中。 嗯。我们添加的子视图是 UIScrollView 的子类,它们的内容是 2048x2048 的图像,通常大小约为 2MB。 尝试使用小图像文件或不使用图像,看看延迟是否仍然存在......如果没有,那么您可能需要考虑延迟加载图像。 【参考方案1】:

问题最终在于设置子视图的图像属性。 UIImage 不会立即执行其处理,只是为出现在屏幕上做准备——这就是导致延迟的原因。

这个问题引导我走上正轨:

Setting image property of UIImageView causes major lag

他们的解决方案是使用 Core Graphics 自己解压缩/处理图像,效果很好。

【讨论】:

【参考方案2】:

NSTimer 通常在主线程上运行。如果您在主线程上进行同步磁盘访问,那么这将导致卡顿。你如何阅读你的文件?

【讨论】:

它们已经用我们的一个库完成了,但最终它们将被 UIImage imageNamed: 读取。 如果这些文件很大,您需要在后台线程上执行此操作。

以上是关于向 UIScrollview 添加/删除 UIView 时的滞后来源?的主要内容,如果未能解决你的问题,请参考以下文章

向 UIScrollView 添加 5 个图像 [关闭]

任何人都可以向我展示如何向 UIScrollView 添加文本的示例吗?

向 UIScrollView 添加子视图

使用自动布局向 UIScrollView 添加动态大小的视图(高度)

UIScrollView - 无法查看所有 UIView

ios:从 UIScrollview 添加和删除视图