【问题标题】:Source of lag when adding/removing UIViews to UIScrollview?向 UIScrollview 添加/删除 UIView 时的滞后来源?
【发布时间】: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。
  • 尝试使用小图像文件或不使用图像,看看延迟是否仍然存在......如果没有,那么您可能需要考虑延迟加载图像。

标签: ios uiview uiscrollview lag addsubview


【解决方案1】:

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

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

Setting image property of UIImageView causes major lag

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 它们已经用我们的一个库完成了,但最终它们将被 UIImage imageNamed: 读取。
    • 如果这些文件很大,您需要在后台线程上执行此操作。
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多