背景
项目需求需对视图进行截图,但视图中部分文本内容返回的格式是Html,需要通过WKWebView对Html进行加载展示,但对整块视图进行截图WKWebView出现部分内容展示空白。
// 截图代码
UIGraphicsBeginImageContextWithOptions(self.headerView.frame.size, NO, [UIScreen mainScreen].scale);
[self.headerView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
解决方式
方式一: 使用UIWebView替代WKWebView
使用UIWebView加载Html可通过上图代码进行截图,并无出现部分截取空白的情况,但是现在Apple在用WKWebView替换UIWebView后,并且规定2020年4月后新上架的包如果包含UIWebView将无法提交构建版本,而且2020年12月份以后已经上架的包也将无法提交构建版本。使用UIWebView替代的这条路给堵的死死的。
方式二:更改Frame
根据苹果的官方文档,WKWebView在加载优化上优于UIWebView难道就是优化在这个地方😑?笔者不知。
本来想着是不是因为frame与contentSize不一致导致的滑动渲染,想通过在截图前保存View的frame以及webView的offset,再完成截图后进行恢复,但是由于项目本身的frame与contentSize的宽高都是一样的😑。
方式三:滑动截图拼接
既然WKWebView是滑动渲染,那笔者就按照你的渲染模式去截图了。滑动截图的话,在尝试的过程中发现,我视图滚动的时候才能截图,这让用户感觉肯定很不爽,既然你明面上不想让用户感知,那只能偷偷的做了,这时候就需要一张视图遮盖在屏幕上以达到用户无感知。一切就是这么巧 ** UIView+UISnapshotting分类的- (nullable UIView )snapshotViewAfterScreenUpdates:(BOOL)afterUpdates API_AVAILABLE(ios(7.0))* 帮你实现了这张遮罩视图的方法。当然你也可以自己添加视图实现。
滑动截图核心代码: