解决 wkwebview 滚动后白屏问题

·  阅读 797
原文链接: www.jianshu.com

有这样一个场景;

整个页面是一个 scrollVIew,宽度为屏幕宽度,pagingEnabled=YES,内容宽度为 2 * 屏幕宽度,里面有两个子 controller,每个子 controller 都有一个全屏的 wkwebview。 左右滑动 scrollView 可以切换两个 wkwebview 的显示,每个 wkwebview 都有一个很长的页面,可以上下滚动 。

按照以下操作;

  1. 第一个 wkwebview,触发一次滚动,在滚动没有结束的时候,切换到第二个 wkwebview;
  2. 在第二个 wkwebview 里停留,等第一个 wkwebview,触发的滚动结束后,切换到第一个 wkwebview;
  3. 此时,第一个 wkwebview,界面空白或者残缺不全,稍微触发下滚动,界面会再次显示。
  4. 如果在第一个 wkwebview 触发的滚动未结束时,返回到 第一个 wkwebview,不会出现 bug。

这个 bug 在 iOS 11 + 都有。
经过我的搜索,应该是 webkit 自己的 bug,bugs.webkit.org/show_bug.cg…。 目前还没有解决。

临时的解决方案是:在第一个 wkwebview 再次可见时触发一次 scroll。注意:这次设置 offset 不能触发 scrollViewDidScroll, 否则会死循环。代码如下;

CGPoint offset = h5.tableView.contentOffset;
            CGRect scrollBounds = h5.tableView.bounds;
            //http://stackoverflow.com/questions/9418311/setting-contentoffset-programmatically-triggers-scrollviewdidscroll
            scrollBounds.origin = CGPointMake(offset.x, offset.y + 0.1f);
            h5.tableView.bounds = scrollBounds;
            
            [h5.tableView flashScrollIndicators];
复制代码

移动一个很小的位移,基本用户不会察觉到的。