【问题标题】:Can I maintain smooth scrolling when loading HTML into child UIWebView?将 HTML 加载到子 UIWebView 时可以保持平滑滚动吗?
【发布时间】:2012-07-15 12:27:24
【问题描述】:

我需要在 iPad 应用程序中显示一个分页幻灯片,其中包含适度 DOM 密集型 HTML 页面。
所有文档都是为 iPad 屏幕量身定制的,所以UIWebViews 内永远不会有任何滚动。

我决定将UIWebViews 放在UIScrollView 中进行分页。
在所有 Web 视图都呈现其内容后,它运行得非常好和流畅。

但是,我无法在用户滚动之前等待 20、30 或 50 个 Web 视图加载:这需要几分钟。
我试图预测scrollViewDidScroll 处理程序中的滑动,并在用户继续滚动时预加载几个下一页

这样效果更好(10 次或 150 次网页浏览之间没有性能差异)。
但是scrollViewDidScroll 处理程序中调用loadHTMLString 会导致滚动失去平滑度

我不在乎显示一个特定的UIWebView 是否需要多一秒钟——我想要的只是让滚动尽可能流畅和可用,并在旅途中懒惰地预加载UIWebViews。

我如何做到这一点?

【问题讨论】:

    标签: objective-c ios uiwebview uiscrollview smooth-scrolling


    【解决方案1】:

    这是一个难题,没有简单/优雅的方法来解决它。

    加快滚动速度的一种方法是延迟加载页面,如您在问题中所述。但是,为了确保平滑度,您必须控制加载发生的时间。

    假设您在首次启动时加载了前 5 个页面。当用户滚动到第 2 页并停止时,您开始加载第 6 页。一旦用户再次开始滚动,您就暂停加载,只有在他们停止在新页面上时才能继续加载。在两者之间暂停加载将有助于平滑滚动。此外,请确保尽可能发布数据,因为它会累积并阻碍向下平滑滚动。

    另一种选择是让 UIWebView 仅在用户在页面上停止时才开始加载。所以说我滚动到页面,一旦滚动停止,我就开始加载 HTML。这不像第一个选项那样“漂亮”,但它将确保滚动流畅。

    另一种选择,这个有点过时,是运行并加载所有 HTML 页面富文本。省略所有 DOM 密集型的东西。然后抓取那些半加载页面using this method 的屏幕截图。当用户停在页面上时,您会一直加载它,包括 DOM 密集型内容。这将让用户感觉他们正在快速滚动加载所有内容。

    Here is a great scrolling class that I have used before.

    Here is some code to help with method 3.

    祝你好运,我希望这会有所帮助!

    编辑: Here is a great post from the guys at LinkedIn on how they solved webView scrolling problems. It would be worth a read.

    【讨论】:

    • 感谢您的宝贵时间。我没有意识到我可以取消加载 HTML。我现在就试试这个。
    • 我刚尝试在用户开始拖动时调用stopLoading,虽然效果明显好转,但仍远非无缝。当用户立即滚动我们认为加载内容是安全的时,问题就会显现出来。滚动事件排队,我们无法在加载完成之前知道用户的滚动意图。
    • 嗯,这很烦人:P 我不确定我是否理解您评论的最后一部分。你能再解释一下吗?抱歉,我今天有点慢。
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多