如何提高UIWebView滚动性能?

Bry*_*ace 14 performance scroll webkit uiwebview ios

我正在构建一个UIWebView包含大量图像,CSS,嵌入式视频和JavaScript tap处理程序的应用程序.滚动表现很糟糕,我正在寻找有效改善这种情况的方法.

如果以下任何特征导致延迟UIWebView滚动?还有哪些其他因素可能阻碍绩效?

  • 图像数量
    • 我应该在用户滚过它们时从DOM中删除图像,如果它们向上滚动则将它们添加回来吗?
  • 图像大小
    • Web视图中的Retina质量图像是否会比较小版本影响滚动性能?
  • 图像缩放
    • 提前调整图像大小会产生很大的不同,而不是依赖于Web视图来根据声明进行扩展width: 100%;吗?
  • CSS
    • 我已经避免了box-shadow,但是还有其他CSS属性,这些属性也会对滚动性能产生负面影响吗?

如果有任何其他资源或工具可用于分析,我很乐意听到它们.

Anh*_* Do 8

这是我刚才从Apple Developer Technical Support获得的答案:

目前,我们没有提供任何优化UIWebView渲染的机制.您看到差异的原因是Mobile Safari和UIWebView没有使用相同的渲染引擎.

性能取决于加载的内容.如果正在使用javascripts或使用插件,这可能会影响性能.

我建议您在http://developer.apple.com/bugreporter/上提交错误报告,详细说明您的情况.这还可以让您了解错误报告的状态.

UIWebView的一个可能的替代方案是开源DTCoreText库:https://github.com/Cocoanetics/DTCoreText,它为Float Reader应用程序提供支持:http://itunes.apple.com/us/app/float-reader/id447992005?MT = 8


joe*_*sim 5

LinkedIn的工作人员在他们的iPad应用程序上完成了UIWebView和HTML5的广泛工作.他们的整个视频,文本和视频都很重要,在UIWebView中呈现.

以下博客文章应该为您提供许多性能改进的起点

LinkedIn for iPad:5种HTML5平滑无限滚动技巧


rjo*_*ens 1

不久前我也遇到过类似的问题。我发现将 webview 放在滚动视图中可以显着提高滚动性能。webview 完成加载后,我禁用了 webview 上的滚动,将 webview 的框架和滚动视图的 contentSize 设置为 webview 内容的大小。

-(void) webViewDidFinishLoad:(UIWebView *)webView {   
    float size = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
    [self.scrollView setContentSize:CGSizeMake(self.view.frame.size.width, size)];
    [webView setFrame:CGRectMake(webView.frame.origin.x,
                                 webView.frame.origin.y,
                                 webView.frame.size.width,
                                 size)];

    [(UIScrollView*)[webView.subviews objectAtIndex:0] setScrollEnabled:NO];
}
Run Code Online (Sandbox Code Playgroud)

我假设网络视图不会加载图像,直到它即将出现在屏幕上,这导致了口吃,并且通过将其放入滚动视图并将框架设置为内容大小,它必须提前加载它们,但我不确定。我也确信这会产生后果(即预先增加内存使用量),但我这样做从来没有遇到任何问题。

  • 我还不能投反对票,但这是一个严重的禁忌。这种解决方案会导致整个webView被绘制到它的CALayer中(使UIWebView的平铺渲染机制失效),从而导致大量的内存使用。OP 对其页面的描述“包含大量图像、CSS、嵌入式视频和 JavaScript 点击处理程序”将导致应用程序使用过多的内存。 (3认同)
  • 我不同意你的说法。问题的标题是改进 UIWebView 滚动的方法。这是一种需要付出代价的方式,就像所有事情一样。就我而言,也可能是OP的情况,我能够负担得起这笔费用,并且它提供了一个更可用的网络视图。 (3认同)
  • 那么你的意思是我用内存换取性能?我就是这么想的。我同意这不是一个很好的解决方案,但这是我能找到改进滚动的唯一方法。鉴于我提前确切知道什么内容将被加载到 web 视图中,并且所有资源都与应用程序捆绑在一起,所以我这样做没有任何问题。 (2认同)
  • 我已经使用了 rjowens 发布的确切方法。我添加的是一种在内容移出屏幕超出项目认为“可用”的内容后“出列”的方法。在某种程度上被认为是软分页。它提高了内存和滚动性能。特别是如果您的内容是线性提供的。所以我会投票赞成 rjowens 的评论,因为它很激烈,而 Leo 的评论则提出了一个大问题 (2认同)