WKWebView 整个网页截屏

坑1. WKWebView 截屏问题

在iOS8之前,使用的UIWebView是renderInContext 截图.

- (UIImage *)screenView:(UIScrollView *)view andOriginFrame:(CGRect)originFrame{
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(SCREEN_WIDTH,view.frame.size.height), YES, 0);     //设置截屏大小
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CGImageRef imageRef = viewImage.CGImage;
    UIImage *sendImage = [[UIImage alloc] initWithCGImage:imageRef];
    UIImageWriteToSavedPhotosAlbum(sendImage, nil, nil, nil);//保存图片到照片库
    return sendImage;
    
}

但是,直接UIWebView替换成WKWebView,会发现截屏的出来的Image 是 WKWebView的背景色,里面没有任何内容.

- (UIImage*)captureView:(UIView *)theView frame:(CGRect)originFrame
{
    UIGraphicsBeginImageContext(theView.frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage *img;
    if([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0)
    {
        for(UIView *subview in theView.subviews)
        {
            [subview drawViewHierarchyInRect:subview.bounds afterScreenUpdates:YES];
        }
        img = UIGraphicsGetImageFromCurrentImageContext();
    }
    else
    {
        CGContextSaveGState(context);
        [theView.layer renderInContext:context];
        img = UIGraphicsGetImageFromCurrentImageContext();
    }
    UIGraphicsEndImageContext();
    CGImageRef ref = CGImageCreateWithImageInRect(img.CGImage, theView.frame);
    UIImage *CGImg = [UIImage imageWithCGImage:ref];
    CGImageRelease(ref);
    
    //图行复原
    theView.frame = originFrame;
    [theView.superview layoutIfNeeded];
    
    return CGImg;
}

替换成上面的方法,将renderInContext: 替换成drawViewHierarchyInRect:afterScreenUpdates:截屏正常

坑2.截取整个界面

具体方法如下,实现逻辑是:

  • 将WKWebView的ScrollView设置为跟WKWebView 内容一般大小.这样ScrollView 现在就能展示整个的WebView(在屏幕外面的内容看不到而已).
  • 然后将scrollView内的全部图层绘制到上下文中.
  • 保存图片
-(UIImage *)getCoverView{
    
    UIScrollView *rt = self.view.subviews.firstObject;
    rt.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-64);
    CGRect originFrame = rt.frame;
    CGRect frm=rt.frame;
    frm.size.height = self.wkWebView.scrollView.contentSize.height;
    rt.frame=frm;
    [rt.superview layoutIfNeeded];
    return  [self  captureView:rt frame:originFrame];
   
}
- (UIImage*)captureView:(UIView *)theView frame:(CGRect)originFrame
{
    UIGraphicsBeginImageContext(theView.frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIImage *img;
    if([[[UIDevice currentDevice] systemVersion] floatValue]>=7.0)
    {
        for(UIView *subview in theView.subviews)
        {
            [subview drawViewHierarchyInRect:subview.bounds afterScreenUpdates:YES];
        }
        img = UIGraphicsGetImageFromCurrentImageContext();
    }
    else
    {
        CGContextSaveGState(context);
        [theView.layer renderInContext:context];
        img = UIGraphicsGetImageFromCurrentImageContext();
    }
    UIGraphicsEndImageContext();
    CGImageRef ref = CGImageCreateWithImageInRect(img.CGImage, theView.frame);
    UIImage *CGImg = [UIImage imageWithCGImage:ref];
    CGImageRelease(ref);
    
    //图行复原
    theView.frame = originFrame;
    [theView.superview layoutIfNeeded];
    
    return CGImg;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 想必使用iPhone的用户, 大家都知道按照Home键+电源键就可以截屏了。 截屏对于产品经理、工程师、设计师都比...
    Startry阅读 12,599评论 21 44
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,806评论 4 61
  • WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨...
    Aiana阅读 10,167评论 1 8
  • 转载:http://www.cnblogs.com/NSong/p/6489802.html 导语 WKWebVi...
    李小威阅读 10,333评论 8 9
  • iOS 的 Cookie 存取 https://juejin.im/entry/58d4c4cc44d904006...
    Farmers阅读 11,311评论 0 16

友情链接更多精彩内容