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. 自动驾驶仿真分析,提高研发效率
  2. SpringMVC 使用hibernate返回list
  3. golang实现聊天室(三)
  4. 03.Mybatis优化
  5. 苦逼的是怎么又有东西没记住,但我们依然每天坚持一遍、一遍又一遍指导记住为止。
  6. 你的消息队列如何保证消息不丢失,且只被消费一次,这篇就教会你
  7. python的运行环境是如何搭建的_教女朋友学Python运行环境搭建
  8. 每一个企业的供应商都有供应商
  9. CocosCreator中Protobuf的简单使用
  10. [修复] Eclipse – Java编译器级别与已安装的Java项目构面的版本不匹配
  11. Linux 网易云音乐问题汇总
  12. layui自定义表单验证无效
  13. C# int和byte[]之间的互转
  14. 人心是暖的,眼泪是苦的,杜鹃花真的很香
  15. continous attractor neural networks - 连续吸引子网络(ing)
  16. 霹雳吧啦Wz语义分割学习笔记P1
  17. Apache -FOPToPDF-Java对象输出实例代码
  18. linux重启搜狗输入法命令
  19. 关于adb出现的错误
  20. 比尔盖茨:AI将如何减少不平等现象?

热门文章

  1. bootloader stage1 和 stage2
  2. 攻防世界 stage1讲解
  3. windchill系统安装大概步骤
  4. MATLAB中安装c语言编译器方法
  5. Windows10 无法打开.exe可执行文件的解决方法
  6. android竖屏显示
  7. 世界首富---比尔·盖茨的豪宅大探密
  8. CentOS7图文详细安装教程
  9. streamlit保持变量(Persistence of a single variable)
  10. Ubuntu下添加Python环境变量