使用带有动态渲染项目的 UIScrollView 消除滚动滞后

Posted

技术标签:

【中文标题】使用带有动态渲染项目的 UIScrollView 消除滚动滞后【英文标题】:Remove scrolling lag with UIScrollView with dynamically rendered items 【发布时间】:2012-04-30 12:47:40 【问题描述】:

我有一组包含图像、视频和 .gif 图像的项目,这些项目显示在 UIWebView 中,当用户滚动到屏幕底部并到达当前 UIScrollView 偏移量的末尾时,这些项目正在动态呈现。从网络下载项目时,我可以显示一个活动指示器,使用户体验流畅和良好,但是当我缓存所有数据并从缓存中检索它时,当所有项目同时呈现时,我有一个非常烦人的延迟时间(每次装载操作 5 个项目)。我的问题是:在 UIScrollView 上渲染项目时,是否可以以某种方式消除滞后?以及如何在主线程上渲染项目时显示活动指示器? 特别是当用户滚动到底部时会发生延迟,滚动冻结,所有项目都被渲染并且滚动继续以用户具有的相同力向下滚动拖着它。

附:我不能使用 UITableView,所以请不要建议使用它来代替滚动视图。

【问题讨论】:

【参考方案1】:

您应该考虑使用 Nimbus 项目中的 NINetworkImageView:https://github.com/jverkoey/nimbus

它在您的场景中运行良好的原因是它在不同的线程上操作获取的图像。它会执行裁剪和调整大小等操作,并在主线程上为您提供最终结果。

如需更完整的示例,请在此处查看我的回答:https://***.com/a/10361005/434841 类似问题。

【讨论】:

我正在一个单独的线程上下载图像。问题不在于如何在后台线程上下载图像,而在于如何在滚动和渲染项目的同时消除 UIScrollView 的滞后以及是否有可能。还是谢谢 问题出在哪里有点难以理解,常见的错误之一是使用大图并让 UIImageView 将其渲染得更小。请发布您的代码,以便我看一下。您是否尝试在该场景中使用 Nimbus? 您好 Yosi,感谢您的关注。我正在下载图像,将它们调整为较小的图像并使用调整后的版本,所以这里没有问题。我的问题是 UI 卡住了,我通过绘制活动指示器并要求用户等待来解决问题......我仍然会将您的答案标记为正确,谢谢 Eugene,这意味着您正在阻塞主线程,这是您应该始终避免的事情 - 您应该能够让用户能够取消长时间运行的进程并且如果您阻塞主线程点击不会注册。

以上是关于使用带有动态渲染项目的 UIScrollView 消除滚动滞后的主要内容,如果未能解决你的问题,请参考以下文章

带有 AutoLayout 的 UIScrollView 内的 UITableView 动态内容大小高度

带有动态文本和图像的 UIScrollView

带有自动布局的 uiscrollview 的动态内容未按预期工作

子视图内的 UIScrollview 高度动态变化

UIScrollView:处理动态内容?

UIScrollView 内的 UIStackView 与动态变化的项目