WKWebView的屏幕截图问题总结

WKWebView的屏幕截图问题总结

  • WKWebView的屏幕截图问题
    • 问题描述
    • 出bug的截图方法
    • 解决问题的截图方法
    • 原因总结
    • 后记

WKWebView的屏幕截图问题

问题描述

在iOS9上使用截图方法对wkwebview展示的h5内容进行截图,截图后是空白界面,在uiwebview上截图正常,在wkwebview
iOS10 以上也正常。

出bug的截图方法

+ (UIImage *)sb_creatImageByView:(UIView *)view {
    CGRect rect = view.frame;
    
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];
    
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return img;
}

解决问题的截图方法

+ (UIImage *)createImageWithView:(UIView *)view {
    CGSize s = view.bounds.size;
    //第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了,设置为[UIScreen mainScreen].scale可以保证转成的图片不失真。
    UIGraphicsBeginImageContextWithOptions(s, YES,[UIScreen mainScreen].scale);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage*image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

原因总结

  • view中任意一个子View(包含WKWebView), 则采用drawViewHierarchyInRect 的方式去截取视图
  • view中任意一个子View(不包含WKWebView), 则采用renderInContext的方式去截图

经过网上查询资料,主要说对于一般的容器比如uiwebview,全部内容是一次渲染的可以使用 renderInContext,而wkwebview在渲染时做了优化可以分次渲染,drawViewHierarchyInRect这个放过后面的bool值设置yes有延时的作用,所以用这个方法可以正常的截图。

后记

以上内容均为本人工作的总结,如有错误,欢迎指正。

你可能感兴趣的:(OC)