加载其他网址时,WKWebView不会重新呈现内容

时间:2015-05-04 16:06:29

标签: ios objective-c webkit wkwebview

我目前正在开发一个使用UIWebView来显示某些内容的应用程序。它曾经与UIWebView一起正常工作,但是当我们将操作系统要求提高到8.1时,我们决定切换到WKWebView。我们注意到性能有了很大的提高,但是一些简单的认为过去工作正常,现在开始失败了。经过一些研究,我设法看到了什么 - 但我不知道如何解决它。我想知道是否有人可以帮我一把......

我们的webview加载的URL花了很多时间来完成这项工作,所以在开始请求之前我们加载一个静态微调器,这样用户就不会觉得应用程序已经疯了。该静态内容的加载周期已经调整,因此我们不会启动URL请求,直到静态内容已正确加载。只要用户不旋转设备,这样就可以正常工作。这是可以看到的:

(出于隐私目的,我不得不更改视图。毕竟,我不是此代码的所有者: - )

enter image description here

我正在使用此HTML代码来测试大小。身体的背景颜色为深灰色,丑陋的浅灰色盒子扩展到宽度的100%,减去了边缘。到现在为止还挺好。但是如果用户旋转设备,就会发生这种情况:

enter image description here

这是令人毛骨悚然的,因为显然身体的拉伸与最大宽度相匹配,但内部div正在处理错误的相对大小。只要正在处理请求,这就会继续。当我强制超时以使请求失败时,WKWebView重新呈现并显示其正确的外观:

enter image description here

一旦我发现了这一点,我尝试了订阅旋转观察器并在webview上强制重新渲染,但没有成功:

  • viewNeedsDisplayUIWebView内部
  • 致电UIScrollView
  • 调整UIWebView
  • 的大小
  • 重新定位UIScrollView内容

所以,到目前为止我的结论是:

  • 这并没有发生在UIWebView上,只是在新的WKWebView上(我再次对此进行了测试,确认了)
  • 看似WKWebView在加载状态时无法正确呈现视图

有人知道是否有办法解决这个问题?像我失踪的一个神奇属性,默认情况下被禁用?我不想在重新制作网页视图时认为他们打破了这一部分...提前致谢:)

编辑:自创建帖子以来我尝试过的东西没有成功:

  • 通过使用javascript /原生轮换回调异步更改DOM 无法正常工作。在http请求结束之前,这些更改不会被呈现。
  • 使用dispatch_async方法在另一个主题中调用http请求不起作用。在引擎盖下,WKWebview可能最终使用相同的线程,就像从主线程中调用它一样。

2 个答案:

答案 0 :(得分:2)

如果你不介意有点hacky,有很多方法可以使用Javascript:

  1. 您可以添加检测window.orientationwindow.onresize等更改的Javascript。查看是否有任何与帧相关的事件被调用。如果他们被调用,只需使用Javascript自行调整div。

  2. 如果事件永远不会被触发,您可以使用evaluateJavaScript:completionHandler:

  3. 自行伪造它们
  4. 您也可以通过这种方式制作自己的活动。只要您在应用中检测到设备方向发生变化,只需发送一个resize div脚本。

  5. 如果您要加载Javascript,则可以查看async标记的defer<script>。这意味着您必须更改Webview中的代码。

  6. 这不是解决这个问题的最佳方式,但它需要的改动最少。

    我还建议您在https://bugreport.apple.com/填写错误报告,以便您知道它是否是预期的行为。

答案 1 :(得分:0)

虽然在加载内容时我没有WKWebView无法呈现的解决方案,但我建议您对问题进行不同的修复。

您可以将加载视图从webview中加载的页面更改为本机iOS视图。只需在主视图中添加子视图,在开始加载时在webview上方添加,并在加载完成后将其删除。这可以在旋转时正常工作,因此您可以获得与以前相同的体验。

另一种解决方案是将加载视图加载到UIWebView之前,就像之前所做的那样,旋转工作正常,而后面的WKWebView中的普通页面。加载页面时,您只需隐藏或删除UIWebView