前言
由于项目中存在夜间皮肤模式,在使用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的渲染机制
可以参见耗子大叔的文章。
网友评论