Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 提高UIWebView滚动性能的方法?_Ios_Performance_Uiwebview_Webkit_Scroll - Fatal编程技术网

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处理程序。滚动的性能是不稳定的,我正在寻找最有效的方法来改善这一点

如果下列任何特征导致laggy
UIWebView
滚动,则会出现哪种情况?其他哪些因素可能会阻碍绩效

  • 图像数量
    • 当用户滚动经过DOM时,我是否应该从DOM中删除图像,如果它们向上滚动,我是否应该添加它们
  • 图像大小
    • web视图中的视网膜质量图像对滚动性能的影响会比小型版本大得多吗
  • 图像缩放
    • 提前调整图像的大小会有很大的不同吗,而不是依赖web视图根据
      width:100%这样的声明进行缩放
  • 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属性等)将产生最大的影响。