iOS 对当前webView进行截屏的方法

UIWebView和WKWebView的截屏有所区别:

UIWebView:

func getImage(context: ServiceExecuteContext) -> UIImage {
    //创建一个基于位图的图形上下文并指定大小
    UIGraphicsBeginImageContextWithOptions(context.fromViewController.webView.bounds.size, true, 0)
    //renderInContext呈现接受者及其子范围到指定的上下文
    context.fromViewController.webView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    //返回一个基于当前图形上下文的图片
    let image = UIGraphicsGetImageFromCurrentImageContext()
    //移除栈顶的基于当前位图的图形上下文
    UIGraphicsEndImageContext() 

    //let imagRef = CGImageCreateWithImageInRect((image?.CGImage)!, context.fromViewController.webView.bounds)
    //let newImage = UIImage.init(CGImage: imagRef!)
    //UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil);//保存图片到照片库
    return image!
  }

UIGraphicsBeginImageContext()方法传入唯一参数,是一个CGSize变量,用来指定图形context的大小,所以获取屏幕截图的时候这个size该是屏幕的大小。其实了解了这个过程,就知道这个方法可以获取任意区域的截图,当然是必须当前页面的一部分。你需要截取哪个view的图像,就让这个view的layer调用renderInContext把图形渲染进当前图形context。

WKWebView:

当我尝试去截取WKWebView的图。截图的结果返回给我的就仅仅只是一张背景图, 显然截图失败。通过搜索StackOverflow和Google, 我发现WKWebView并不能简单的使用layer.renderInContext的方法去绘制图形。如果直接调用layer.renderInContext需要获取对应的Context, 但是在WKWebView中执行UIGraphicsGetCurrentContext()的返回结果是nil

StackOverflow提供了一种解决思路是使用UIView的drawViewHierarchyInRect方法去截取屏幕视图。通过直接调用WKWebView的drawViewHierarchyInRect方法(afterScreenUpdates参数必须为true), 可以成功的截取WKWebView的屏幕内容

func getImage(context: ServiceExecuteContext) -> UIImage { 

    UIGraphicsBeginImageContextWithOptions(context.fromViewController.webView.bounds.size, true, 0)
    for subView: UIView in context.fromViewController.webView.subviews {
      subView.drawViewHierarchyInRect(subView.bounds, afterScreenUpdates: true)
    }
    //UIApplication.sharedApplication().keyWindow?.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext() 

    //let imagRef = CGImageCreateWithImageInRect((image?.CGImage)!, context.fromViewController.webView.bounds)
    //let newImage = UIImage.init(CGImage: imagRef!) 

    return image!
  }

以上这篇iOS 对当前webView进行截屏的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • iOS 对当前webView进行截屏的方法

    UIWebView和WKWebView的截屏有所区别: UIWebView: func getImage(context: ServiceExecuteContext) -> UIImage { //创建一个基于位图的图形上下文并指定大小 UIGraphicsBeginImageContextWithOptions(context.fromViewController.webView.bounds.size, true, 0) //renderInContext呈现接受者及其子范围到指定的上下文

  • android中Webview实现截屏三种方式小结

    本人最近学习了android中Webview实现截屏三种方式,下面我来记录一下,有需要了解的朋友可参考.希望此文章对各位有所帮助. 第一种方式 通过调用webview.capturePicture(),得到一个picture对象,根据图像的宽和高创建一个Bitmap,再创建一个canvas,绑定bitmap,最后用picture去绘制. //获取Picture对象 Picture picture = wv_capture.capturePicture(); //得到图片的宽和高(没有reflec

  • Android编程之截屏实现方法(包括scrollview与listview)

    本文实例讲述了Android编程之截屏实现方法.分享给大家供大家参考,具体如下: public class ScreenShot { // 获取指定Activity的截屏,保存到png文件 public static Bitmap takeScreenShot(Activity activity) { // View是你需要截图的View View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(tr

  • Android 下调试手机截屏的方法

    Android 下调试手机截屏的方法 Android开发过程中,难免会需要对手机进行截屏.以前截屏时一直到处找截屏软件,操作复杂. 今天刚发现,原来ADT是自带截屏功能的,而且操作简单. 打开DDMS视图,在Device框的右上角有一个照相机的小图标按钮,此按钮即可实现截屏功能,如图. 点击该按钮时,弹出如下对话框: 然后就可以将截屏图片保存或复制了! 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • Android实现矩形区域截屏的方法

    对屏幕进行截屏并裁剪有两种方式:早截图和晚截图.早截图,就是先截取全屏,再让用户对截取到的图片进行修改:与之相对的,晚截图,就是先让用户在屏幕上划好区域,再进行截图和裁剪.其实两者并没有什么太大的区别,这篇就说说怎么实现晚截图. 晚截图可以分成三步: 1. 在屏幕上标出截图的矩形区域 2. 调用系统接口截屏 3. 对截图进行裁剪 效果图如下: 第一步.在屏幕上标识出截图区域 首先确定标识截图区域所需要的功能: 1. 手指拖动形成矩形区域: 2. 可以拖动已经划好的矩形区域进行移动: 3. 可以拖

  • IOS 开发之ios视频截屏的实现代码

    IOS 开发之ios视频截屏的实现代码 现在好多视频截屏软件,这里提供一个IOS 视频截屏的方法,大家可以参考下, 实现代码: //截屏 static int i=0; -(IBAction)screenShot:(id)sender{ UIGraphicsBeginImageContextWithOptions(CGSizeMake(640, 960), YES, 0); [[self.window layer] renderInContext:UIGraphicsGetCurrentCont

  • Android实现截屏方式整理(总结)

    本文介绍了Android 实现截屏方式整理,分享给大家.希望对大家有帮助 可能的需求: 截自己的屏 截所有的屏 带导航栏截屏 不带导航栏截屏 截屏并编辑选取一部分 自动截取某个空间或者布局 截取长图 在后台去截屏 1.只截取自己应用内部界面 1.1 截取除了导航栏之外的屏幕 View dView = getWindow().getDecorView(); dView.setDrawingCacheEnabled(true); dView.buildDrawingCache(); Bitmap

  • Android截屏分享功能

    最近项目需要实现Android截屏分享功能,包括Android截屏获取图片.将图片保存到本地.通知系统相册更新.通过微信.QQ.微博分享截屏图片,本篇文章作为总结回顾.     一.Android截屏获取图片 通过对view进行绘制,得到bitmap,可以对Activity.Fragment进行绘制,也可以对其他的View进行绘制.    1 Activity截图(带空白的状态栏) public Bitmap shotScreen(Activity activity) { View view =

  • Android截屏方案实现原理解析

    Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途 在截屏功能中,有时需要截取全屏的内容,有时需要截取超过一屏的内容(比如:Listview,Scrollview,RecyclerView).下面介绍各种场景获取Bitmap的方法 普通截屏的实现 获取当前Window的DrawingCache的方式,即decorView的DrawingCache /** * shot the current screen ,with the sta

  • Android Activity 不能被截屏的解决方法

    在Activity 添加即可 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); 以上这篇Android Activity 不能被截屏的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴趣的文章: Android截屏方案实现原理解析 Android截屏分享功能 Android 下调试手机截屏的方法 Android 实现截屏功能的实例 android长截屏原理及实现代码 Andr

随机推荐