iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >iOS中如何获取某个视图的截图详析
  • 317
分享到

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

ios视图截图 2022-05-29 15:05:24 317人浏览 安东尼
摘要

前言 最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式。 我写了个UIView 的cateGory,将这几种方式封装和简化了一下。 第一种情形截图

前言

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

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

第一种情形截图

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

源码



- (UIImage *)nomalSnapshotImage
{
 UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
 [self.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 
 return snapshotImage;
}

第二种情形截图

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



- (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 *)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;
}

总结

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

--结束END--

本文标题: iOS中如何获取某个视图的截图详析

本文链接: https://www.lsjlt.com/news/30301.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • iOS中tableView右侧索引视图状态获取的示例分析
    小编给大家分享一下iOS中tableView右侧索引视图状态获取的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言在iPhone和其他iOS的很多程序中...
    99+
    2023-06-20
  • 如何创建一个 MySQL 视图,根据某些条件从表中获取值?
    如果我们想创建一个视图,根据某些特定条件从表中获取值,那么我们必须在创建视图时使用 WHERE 子句。取决于 WHERE 子句的值将存储在视图中。使用 WHERE 子句创建 MySQL 视图的语法如下 -语法Crea...
    99+
    2023-10-22
  • Java 截取视频资料中的某一帧作为缩略图
    目录基础知识 FFmpegFrameGrabber BufferedImage,ImageIO MultipartFile 具体实现 引入依赖 最近项目中有一个需求,就是要实现视频资...
    99+
    2024-04-02
  • 如何获取 MySQL 视图列表?
    要获取 MySQL 视图列表,我们可以使用带有 LIKE 运算符的 SELECT 命令。让我们先看看语法。 mysql> SELECT TABLE_SCHEMA, TABLE_NAME -> FROM informat...
    99+
    2023-10-22
  • java如何获取json中的某个值
    在Java中,可以使用JSON库来解析JSON数据并获取其中的某个值。常用的JSON库有Jackson、Gson和JSON-java...
    99+
    2023-10-10
    json java
  • python如何获取json中的某个值
    在Python中,可以使用`json`模块来解析JSON字符串。可以通过将JSON字符串转换为字典或列表的形式,然后使用索引或键名来...
    99+
    2023-09-04
    python json
  • Android开发中如何获取View视图宽与高
    这篇文章将为大家详细讲解有关Android开发中如何获取View视图宽与高,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例讲述了Android开发中获取View视图宽与高的常用方法。分享给大家供大家...
    99+
    2023-05-30
    android view
  • iOS 11开发中iOS11应用视图之如何删除空白视图
    小编给大家分享一下iOS 11开发中iOS11应用视图之如何删除空白视图,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!当开发者不再需要主视图的某一视图时,可以将该视图删除。实现此功能需要使用到removeFromSuper...
    99+
    2023-06-04
  • Java如何获取JSON中某个对象的值
    目录Java获取JSON中某个对象的值使用方式Java正则表达式-获取json某个属性值语法匹配代码Java获取JSON中某个对象的值 public class ChangeJson...
    99+
    2024-04-02
  • Canvas如何获取视频第一帧缩略图
    本篇内容主要讲解“Canvas如何获取视频第一帧缩略图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Canvas如何获取视频第一帧缩略图”吧!记录下一个疑问,最近在重新看canvas做点Demo...
    99+
    2023-06-09
  • ios开发中如何给webView添加头视图
    这篇文章给大家分享的是有关ios开发中如何给webView添加头视图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。给webView添加头视图webView是一个复合视图,里面包含...
    99+
    2024-04-02
  • 如何获取Android raw目录下视频的缩略图
    这篇文章主要介绍如何获取Android raw目录下视频的缩略图,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!以下代码用于获取 Android raw目录下视频文件的缩略图:private Drawable...
    99+
    2023-05-31
    android raw
  • springMVC中的view视图详细解析
    目录1、ThymleafView2、转发视图3、重定向视图4、视图控制器view-controllerSpring MVC中的视图是view接口,视图的作用是渲染数据,将模型mode...
    99+
    2024-04-02
  • oracle如何截取某个字符后的字符
    在Oracle中,可以使用SUBSTR函数来截取某个字符后的字符。SUBSTR函数的语法如下:SUBSTR(string, ...
    99+
    2023-08-08
    oracle
  • iOS 11开发中iOS11应用视图的示例分析
    这篇文章给大家分享的是有关iOS 11开发中iOS11应用视图的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在iPhone或者iPad中,用户看到的和摸到的都是视图。视图是用户界面的重要组成元素。本节将...
    99+
    2023-06-04
  • java如何获取list某个字段的值
    在Java中,可以通过遍历List来获取其中某个字段的值。以下是一个示例代码:```javaimport java.util.Arr...
    99+
    2023-09-25
    java
  • php如何获取mysql查询的某个值
    这篇文章主要介绍“php如何获取mysql查询的某个值”,在日常操作中,相信很多人在php如何获取mysql查询的某个值问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何获取mysql查询的某个值”的疑...
    99+
    2023-07-05
  • vue如何通过某个字段获取详细信息
    目录通过某个字段获取详细信息vue一个字段的值按另一个字段的值 赋值通过某个字段获取详细信息 新增列表后通过name获取用户输入的详细信息 用户输入买方信息后弹出联系信息输入,确定后...
    99+
    2024-04-02
  • JavaCV如何实现读取视频信息及自动截取封面图
    这篇文章主要介绍了JavaCV如何实现读取视频信息及自动截取封面图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaCV如何实现读取视频信息及自动截取封面图文章都会有所收获,下面我们一起来看看吧。javac...
    99+
    2023-07-02
  • MySQL中如何创建一个视图
    在 MySQL 中创建一个视图可以通过使用 CREATE VIEW 语句来完成。视图是基于一个或多个表的查询结果,它类似于虚拟表,可以像表一样查询和使用。 下面是创建一个视图的基本语法: CREATE VIEW view_name ASSE...
    99+
    2023-08-17
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作