向 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 添加文本的示例吗?