Ios 提高UIWebView滚动性能的方法?
我正在构建一个包含Ios 提高UIWebView滚动性能的方法?,ios,performance,uiwebview,webkit,scroll,Ios,Performance,Uiwebview,Webkit,Scroll,我正在构建一个包含UIWebView的应用程序,其中包含大量图像、CSS、嵌入式视频和JavaScript tap处理程序。滚动的性能是不稳定的,我正在寻找最有效的方法来改善这一点 如果下列任何特征导致laggyUIWebView滚动,则会出现哪种情况?其他哪些因素可能会阻碍绩效 图像数量 当用户滚动经过DOM时,我是否应该从DOM中删除图像,如果它们向上滚动,我是否应该添加它们 图像大小 web视图中的视网膜质量图像对滚动性能的影响会比小型版本大得多吗 图像缩放 提前调整图像的大小
UIWebView
的应用程序,其中包含大量图像、CSS、嵌入式视频和JavaScript tap处理程序。滚动的性能是不稳定的,我正在寻找最有效的方法来改善这一点
如果下列任何特征导致laggyUIWebView
滚动,则会出现哪种情况?其他哪些因素可能会阻碍绩效
- 图像数量
- 当用户滚动经过DOM时,我是否应该从DOM中删除图像,如果它们向上滚动,我是否应该添加它们
- 图像大小
- web视图中的视网膜质量图像对滚动性能的影响会比小型版本大得多吗
- 图像缩放
- 提前调整图像的大小会有很大的不同吗,而不是依赖web视图根据
width:100%这样的声明进行缩放代码>
- 提前调整图像的大小会有很大的不同吗,而不是依赖web视图根据
- CSS
- 我已经避免了
,但是是否还有其他CSS属性也会对滚动性能产生不利影响框阴影
- 我已经避免了
如果有任何其他资源或工具可用于评测,我很乐意听到它们。我不久前也遇到过类似的问题。我发现将webview放在scrollview中可以显著提高滚动性能。在webview完成加载后,我禁用了webview上的滚动,将webview的框架和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在图像即将出现在屏幕上之前不会加载图像,这会导致口吃,通过将其放入滚动视图并将帧设置为内容大小,它必须提前加载图像,但我不确定。我也确信这会带来后果(即,提前增加内存使用),但我这样做从来没有遇到过任何问题。这是我不久前从Apple Developer技术支持部门得到的答案: 目前,我们没有提供任何机制来优化UIWebView的渲染。 出现差异的原因是Mobile Safari和UIWebView未使用相同的渲染引擎 性能取决于加载的内容。如果有Java脚本正在运行或正在使用插件,这可能会影响性能 我建议您在详细说明您的情况时提交错误报告。这还将使您了解bug报告的状态
UIWebView的一个可能的替代方案是开源DTCoreText库:,它为Float Reader应用程序提供了动力:LinkedIn的家伙们已经在他们的iPad应用程序上对UIWebView和HTML5做了大量的工作。他们的整个提要包含大量的图像、文本和视频,在UIWebView中呈现 下面的博文应该为您提供许多性能改进的起点
我还不能否决投票,但这是一个严重的否决。此解决方案会导致整个webView被绘制到其CALayer中(使UIWebView的平铺渲染机制失效),从而导致大量内存使用。OP对其页面的描述“包含大量图像、CSS、嵌入式视频和JavaScript点击处理程序”会导致应用程序使用过多内存。那么你的意思是我用内存换取性能?我就是这么想的。我同意这不是一个很好的解决方案,但这是我能找到的唯一改进滚动的方法。考虑到我提前知道什么将被加载到webview,并且所有资产都与应用捆绑在一起,我这样做没有问题。这种交易在UIWebView中是非常危险的,因为它在内存中增长非常快和积极。当内容变得更大、更复杂时,你很快就会发现大量的didReceiveMemoryWarning-s并最终崩溃。我不同意你的说法。问题的标题是改进UIWebView滚动的方法。这是一种需要付出代价的方式,就像所有事情一样。在我的情况下,可能还有OP的情况下,我能够负担得起这样的成本,它提供了一个更有用的网络视图。我使用了rjowens发布的确切方法。我添加的是一种在内容被转移到屏幕外,超过项目认为“可用”的内容后,将其“出列”的方法。在某种程度上,将被视为软分页。它提高了内存和滚动性能。特别是如果您的内容是线性提供的。因此,我会投票支持欧文斯的评论,认为这是一个好消息,而利奥的评论则提出了一个大问题。我知道,性能取决于加载的内容。我希望了解对我的内容的哪些更改(例如,更小的图像、更少的图像、避免某些CSS属性等)将产生最大的影响。