15

我正在构建一个应用程序,其中UIWebView包含大量图像、CSS、嵌入式视频和 JavaScript Tap 处理程序。滚动性能是断断续续的,我正在寻找最有效的方法来改善这一点。

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

  • 图像数量
    • 当用户滚动过去时,我是否应该从 DOM 中删除图像,并在它们向上滚动时将它们添加回来?
  • 图像大小
    • Web 视图中的 Retina 质量图像会比较小的版本对滚动性能的影响更大吗?
  • 图像缩放
    • 提前调整图像大小会产生很大的不同,而不是依靠 web 视图根据声明进行缩放width: 100%;
  • CSS
    • 我已经避免了box-shadow,但是是否还有其他众所周知的对滚动性能产生不利影响的 CSS 属性?

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

4

3 回答 3

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

于 2012-04-24T13:49:45.973 回答
5

LinkedIn 的人在他们的 iPad 应用程序上使用 UIWebView 和 HTML5 做了大量工作。它们包含大量图像、文本和视频的整个提要在 UIWebView 中呈现。

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

LinkedIn for iPad:在 HTML5 中实现平滑无限滚动的 5 种技术

于 2012-06-06T07:09:23.347 回答
1

不久前我有一个类似的问题。我发现将 webview 放在滚动视图中可以显着提高滚动性能。在 webview 完成加载后,我禁用了 webview 的滚动,将 webview 的 frame 和 scrollview 的 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];
}

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

于 2012-04-19T16:28:33.253 回答