iOS中UIWebView、WKWebView夜间模式下闪屏的处理

前言

由于项目中存在夜间皮肤模式,在使用UIWebView、WKWebView的过程中出现了闪屏的问题,也是花了一段时间找到了解决方案,虽然是误打误撞,也希望分享出来对有需要的朋友有帮助吧。

常规的思路

设置控制器的背景颜色、webView的背景颜色、HTML中Body颜色一致,但是实际上并不能解决问题。

误打误撞的解决方案

 contentWebView.opaque = NO;
 contentWebView.backgroundColor = self.view.backgroundColor;

即设置webView的opaque属性为NO,并设置webView的背景色为控制器的背景色。虽然问题解决了,但是总觉得莫名其妙。

闪屏的原因

  • webView的底色与HTML中Body底色不一致。
  • webView中用于显示HTML的子视图底色与HTML中Body底色不一致。

解决第一个则是直接设置背景色即可。但是第二种作为私有的API是不好拿到并设置的,最简单的解决方案是设置webView的opaque属性值为NO,通过遍历子视图发现,设置webView的属性同时也会决定某些子视图的同种属性值。其实参考关于opaque属性的文章以及自己的实践发现,opaque属性并不能控制视图的显示与否。也与这里设置opaque为NO解决了问题而相互矛盾,UIWebView、WKWebView的内部实现机制我们不得而知,这里也不再做追究。

关于opaque属性

这是一个几乎没有用过的属性,并且他并不能决定视图是否真正的透明。关于他的介绍可以参见链接。

关于web的渲染机制

可以参见耗子大叔的文章。

你可能感兴趣的:(iOS中UIWebView、WKWebView夜间模式下闪屏的处理)