UIview截图

  • (UIImage *)captureScreen {
    UIGraphicsBeginImageContextWithOptions(self.frame.size, YES, 0.0f);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
    }

第一种情形截图
这种是最最普通的截图,针对一般的视图上添加视图的情况,基本都可以使用。 源码:
/**
普通的截图
该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;
    }

IOS UIview截图相关推荐

  1. ios uiview动画_iOS UIView动画

    ios uiview动画 In this tutorial, we'll be animating our UI Views in various ways in the iOS Applicatio ...

  2. IOS UIView详解

    文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...

  3. IOS UiView frame哪里来?

    初学ios开发,frame center bounds 一直搞不清楚.最近在看wwdc session 121 UIKit Rendering 找到答案. frame 是计算属性 frame定义是父视 ...

  4. snipaste滚动截图方法_百度终于良心一回,出了一款ios长截图神器!

    今天给大家带来两款好用的截图软件,一个是iOS端,一个是PC端的. 1.滚动截长图(IOS) 大家都知道iOS系统本身是没有长截图工具的,所以只能借助第三方的软件才可以实现这个功能. 滚动截长图是一款 ...

  5. (IOS)截图Demo

    思路是建一个UIView的子类,获取划动出的矩形,用协议将矩形传递给代理对象,依据该矩形完成图像数据的截取,并显示出来. 截图视图类: #import <UIKit/UIKit.h>@pr ...

  6. iOS - UIView属性hidden, opaque, alpha, opacity的区别

    iOS开发-之UIView属性hidden, opaque, alpha, opacity的区别 一.alpha 液晶显示器是由一个个的像素点组成的,每个像素点都可以显示一个由RGBA颜色空间组成的一 ...

  7. ios UIView全部API解读

    /********* UIView是iOS系统界面元素的基础,所有的界面元素都是集成自它.它本身完全是由CoreAnimation来实现的.它真正的绘图部分,是一个叫CALayer(Core Anim ...

  8. iOS设备截图和Windows电脑互传,解决提交bug无图不能说明问题

    在测试iOS应用的时候,需要用到截图功能,所谓有图有真相,可以说明一些bug问题. 然而传统的测试同学,可能就会在iOS设备上下载微信或QQ,然后电脑端也挂上微信.QQ进行互传.这样当然可以解决问题, ...

  9. [Swift]对UIView截图

    /// 对窗口截屏 let image = UIApplication.shared.keyWindow!.screenshotImage()/// 对某一个View截图 let image = se ...

最新文章

  1. 【组队学习】【23期】Datawhale编程实践(区块链)
  2. 自定义验证控件CustomValidator
  3. 快速游戏开发工具GameMaker,Action Game Maker使用体验
  4. Apache Directory 指令
  5. [转]让你赚大钱成富翁的4个投资习惯
  6. 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据
  7. python调用数据库数据创建函数_Pyhton应用程序数据库函数封装
  8. Django中object.all
  9. 和在c语言,?和:在C语言中的详解
  10. CentOS7服务管理(重启,停止,自动启动命令)
  11. Web Components 入门
  12. 霍金临终论文公开:揭秘沉入黑洞的信息去向
  13. div section article区分--20150227
  14. springboot学习笔记03 整合JPA
  15. CentOS 7.5 yum 安装 Git
  16. spring扩展点四:SmartInitializingSingleton 补充
  17. niceScroll 滚动条的用法
  18. 机器学习的所有资源链接和经验教训(八)深度学习框架
  19. 使用pandas的merge出现Empty DataFrame 和 Index: []
  20. 四气调神大论篇 :四季养生法

热门文章

  1. java中的js是什么意思_什么是JavaScript
  2. 心理学的166个现象---之三
  3. 计算机上两个网络,从逻辑功能上可把计算机网络分为( )和( )两个子网。
  4. 02 12 字符串反转;汉字硬反转(天连草色一川平 -> 平川一色草连天)
  5. TimeSpan时间间隔
  6. mybatis读取配置文件报错:Could not find resource configuration.xml
  7. 朱丹为什么是文艺青年
  8. 名帖369 康里巎巎 草书《李白古风诗卷》
  9. 第十八届全国大学生智能车竞赛华南赛区成绩与奖项
  10. C语言之结构体和共同体——结构体的定义和使用