iOS中如何获取某个视图的截图详析

前言

最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。

我写了个UIView 的category,将这几种方式封装和简化了一下。

第一种情形截图

这种是最最普通的截图,针对一般的视图上添加视图的情况,基本都可以使用。

源码:

/**
 普通的截图
 该API仅可以在未使用layer和OpenGL渲染的视图上使用

 @return 截取的图片
 */
- (UIImage *)nomalSnapshotImage
{
 UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
 [self.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return snapshotImage;
}

第二种情形截图

如果一些视图是用OpenGL渲染出来的,那么使用上面的方式就无法截图到OpenGL渲染的部分,这时候就要用到改进后的截图方案:

/**
 针对有用过OpenGL渲染过的视图截图

 @return 截取的图片
 */
- (UIImage *)openglSnapshotImage
{
 CGSize size = self.bounds.size;
 UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
 CGRect rect = self.frame;
 [self drawViewHierarchyInRect:rect afterScreenUpdates:YES];
 UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return snapshotImage;
}

第三种情形截图

有一些特殊的Layer(比如:AVCaptureVideoPreviewLayer 和 AVSampleBufferDisplayLayer) 添加到某个View 上后,使用上面的几种方式都无法截取到Layer上的内容,这个时候可以使用系统的一个API,但是该API只能返回一个UIView,返回的UIView 可以修改frame 等参数。

/**
 截图
 以UIView 的形式返回(_UIReplicantView)

 @return 截取出来的图片转换的视图
 */
- (UIView *)snapshotView
{
 UIView *snapView = [self snapshotViewAfterScreenUpdates:YES];
 return snapView;
}

遗留问题:
通过方式三截取的UIView,无法转换为UIImage,我试过将返回的截图View写入位图再转换成UIImage,但是返回的UIImage 要么为空,要么没有内容。如果有人知道解决方案请告知我。

UIWebView的截图

去年在做蓝牙打印的时候,尝试过将UIWebView 的内容转换为UIImage,写过一个UIWebView的category,也算是对UIWebView 的截图,顺便也贴出来吧

- (UIImage *)imageForWebView
{
 // 1.获取WebView的宽高
 CGSize boundsSize = self.bounds.size;
 CGFloat boundsWidth = boundsSize.width;
 CGFloat boundsHeight = boundsSize.height;

 // 2.获取contentSize
 CGSize contentSize = self.scrollView.contentSize;
 CGFloat contentHeight = contentSize.height;
 // 3.保存原始偏移量,便于截图后复位
 CGPoint offset = self.scrollView.contentOffset;
 // 4.设置最初的偏移量为(0,0);
 [self.scrollView setContentOffset:CGPointMake(0, 0)];

 NSMutableArray *images = [NSMutableArray array];
 while (contentHeight > 0) {
  // 5.获取CGContext 5.获取CGContext
  UIGraphicsBeginImageContextWithOptions(boundsSize, NO, 0.0);
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  // 6.渲染要截取的区域
  [self.layer renderInContext:ctx];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  // 7.截取的图片保存起来
  [images addObject:image];

  CGFloat offsetY = self.scrollView.contentOffset.y;
  [self.scrollView setContentOffset:CGPointMake(0, offsetY + boundsHeight)];
  contentHeight -= boundsHeight;
 }
 // 8 webView 恢复到之前的显示区域
 [self.scrollView setContentOffset:offset];
 CGFloat scale = [UIScreen mainScreen].scale;
 CGSize imageSize = CGSizeMake(contentSize.width * scale,
         contentSize.height * scale);
 // 9.根据设备的分辨率重新绘制、拼接成完整清晰图片
 UIGraphicsBeginImageContext(imageSize);
 [images enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL *stop) {
  [image drawInRect:CGRectMake(0,scale * boundsHeight * idx,scale * boundsWidth,scale * boundsHeight)];
 }];
 UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return fullImage;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • iOS使用WebView生成长截图的第3种解决方案

    前言 WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在iOS8开始使用,WKWebView将逐步取代笨重的UIWebView. 由于项目需要,新近实现了一个长截图库 SnapshotKit.其中,需要支持 UIWebView.WKWebView 组件生成长截图.为了实现这个特性,查阅了很多资料,同时也做了不同的新奇思路尝试,最终实现了一个新的.取巧的技术方案. 以下主

  • iOS捕捉截屏事件并展示截图效果

    摩拜单车.微信的截屏就做的比较人性化. 现在很多APP开始支持用户截屏后,主动获取截图并弹出分享视图,这样用户就不用去相册去找了,感觉体验不错,今天就分享一下 截屏开发的心得,希望能帮助iOS的朋友. iOS7之后,苹果开放出一个通知:UIApplicationUserDidTakeScreenshotNotification,截屏时系统就会发出这个通知,需要你注册这个通知,就能捕捉到截屏图片. 下面的代码,实现的是用户截屏后,捕获到截屏图片,展示出来: //注册截屏通知 [[NSNotific

  • 关于iOS截图你应该知道的那些事儿

    前言 同时按下 Home 键和电源键,咔嚓一声,就得到了一张手机的截图,这操作想必 iPhone 用户再熟悉不过了.我们作为研发人员,面对的是一个个的 View,那么该怎么用代码对 View 进行截图呢? 这篇文章主要讨论的是如何在包括 UIWebView 和 WKWebView 的网页中进行长截图,对应的示例代码在这儿:https://github.com/VernonVan/PPSnapshotKit (本地下载) . UIWebView 截图 对 UIWebView 截图比较简单,rend

  • iOS 对view进行截图的示例代码

    本文主要介绍了iOS 对view进行截图的示例代码,分享给大家,具体如下: 需要对WKWebView进行截图,之前用的是下面的方法,高版本的系统是没有问题的,低版本的却截到一张白图 - (UIImage *)convertViewToImage:(UIView *)view{ // 第二个参数表示是否非透明.如果需要显示半透明效果,需传NO,否则YES.第三个参数就是屏幕密度了 UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.boun

  • IOS实现手动截图并保存

    本文实例介绍了iOS手动剪裁图片并保存到相册的详细代码,分享给大家供大家参考,具体内容如下 一.实现效果 1.操作步骤 绘制一个矩形框,弹出一个alertView,提示是否保存图片 点击"是",将图片保存到相册 在相册中查看保存的图片 2.效果图 二.实现思路 1.在控制器的view上添加一个imageView,设置图片 2.在控制器的view上添加一个pan手势 3.跟踪pan手势,绘制一个矩形框(图片的剪切区域) 4.在pan手势结束时,通过alertView提示"是否将

  • iOS中如何获取某个视图的截图详析

    前言 最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式. 我写了个UIView 的category,将这几种方式封装和简化了一下. 第一种情形截图 这种是最最普通的截图,针对一般的视图上添加视图的情况,基本都可以使用. 源码: /** 普通的截图 该API仅可以在未使用layer和OpenGL渲染的视图上使用 @return 截取的图片 */ - (UIImage *)nomalSnapshotImage { UIGraphicsBeginImageContext

  • iOS中创建表格类视图WBDataGridView的实例代码

    项目中创建表格, 引用头文件 #import "WBDataGridView.h" - (void)viewDidLoad{ [superviewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColorwhiteColor]; CGFloat margin = 10.f; CGFloat width = self.view.frame.size.wi

  • Android中如何获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取视频文件截图 * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bitmap */ public static Bitmap getVideoThumb(String path) { MediaMetadataRetriever media = new Me

  • IOS中计算缓存文件的大小判断实例详解

    IOS中计算缓存文件的大小判断实例详解 IOS中计算缓存文件的大小判断,在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 实例代码: //获取缓存文件路径 -(NSString *)getCachesPath{ // 获取Caches目录路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCaches

  • IOS 开发之PickerView自定义视图的实例详解

    IOS 开发之PickerView自定义视图的实例详解 例如选择国家,左边是名称右边是国家,不应该使用两列,而是自定义PickerView的一列,可以通过xib来实现. 注意,虽然PickerView也是一列,但是数据源方法是@required,所以必须实现. 因此,核心思想就是一列,自定义PickerView的行视图. 使用viewForRow方法可以设定行视图. 这样的视图可以通过xib和它的控制器进行封装: Xib的控制器继承自UIView类即可. 控制器维护一个用于设置数据的模型对象fl

  • 详解IOS中Tool Bar切换视图方法

    本文通过实例给大家详细讲解了IOS开发中Tool Bar切换视图方法以及原理解释,希望我们的整理对你有用,一起学习下. iOS中几种典型的多视图程序: (1)Tab Bar Application:程序的底部有一排按钮,轻触其中一个按钮,相应的视图被激活并显示出来: (2)Navigation-Based Application:其特点是使用navigation controller,而navigation controller使用navigation bar来控制多级视图: (3)Tool B

  • iOS中自动实现对象序列化的方法详解

    前言 在iOS 中实现对象序列化,需要遵行NSCoding协议,然后对对象的每个属性进行归档和接档赋值,响应的操作比较繁琐.本文主要介绍 利用 runtime遍历属性 大大简化代码量,下面来看看详细的介绍吧. 具体实现代码如下: 1.先建立NSobject的分类, 定义可能用到的相关类型 static NSString *intType = @"i"; // int_32t(枚举int型) static NSString *longTpye = @"l"; //lo

  • iOS中Block的回调使用和解析详解

    Block 回调实现 先跟着我实现最简单的 Block 回调传参的使用,如果你能举一反三,基本上可以满足了 OC 中的开发需求.已经实现的同学可以跳到下一节. 首先解释一下我们例子要实现什么功能(其实是烂大街又最形象的例子): 有两个视图控制器 A 和 B,现在点击 A 上的按钮跳转到视图 B ,并在 B 中的textfield 输入字符串,点击 B 中的跳转按钮跳转回 A ,并将之前输入的字符串 显示在 A 中的 label 上.也就是说 A 视图中需要回调 B 视图中的数据. 想不明白的同学

  • iOS中封装.framework及使用的方法详解

    .framework是什么? 这个问题相信做iOS的都知道答案. 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝.微信SDK等等中的库,这些库可以给我们的开发带来很大的便利.有的时候,由于工作的需要,我们需要对自己的项目进行封装,生成库,方便别人的使用.在这里就边参考好点的博客,边总结一下我们经常看到的.framework. 那什么是"库"呢? "库"是共享程序代码的一种方式!同行总结的这句话很简单也很好的说明了它的作用! 一般的分为"静态库

  • iOS中PNChart与UITableView的联动示例详解

    前言 在开发中,特别是销售企业内部使用的APP,可能会用到数据汇总,使用到图表的功能!本文主要给大家介绍了关于iOS中PNChart与UITableView联动的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 效果图 1.点击chart,tableView对应模块高亮 PNChart提供了一个代理方法,用来处理用户的点击事件: #pragma mark - PNChart Delegate - (void)userClickedOnPieIndexItem:(NSInt

随机推荐