iis服务器助手广告
返回顶部
首页 > 资讯 > 服务器 >iOS-长截图 (学习记录)
  • 385
分享到

iOS-长截图 (学习记录)

ios学习webviewobjective-c 2023-09-17 18:09:11 385人浏览 泡泡鱼
摘要

目录 前言iOS — 绘制截图 WKWebView长截图思路实现外部方法截图操作方法 End 前言 长截图 —— 也就是可以截到超出屏幕的长图。在实现长图之前,我们先要了解一

目录

前言

长截图 —— 也就是可以截到超出屏幕的长图。在实现长图之前,我们先要了解一下iOS的绘制普通截图操作。在此基础上,来实现长截图。

ioS — 绘制截图

 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale); [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
  • UIGraphicsBeginImageContextWithOptions 该函数开始创建图片上下文,它有三个参数:
    size:想要渲染图片的大小尺寸
    opaque:所要创建图片的背景是否是不透明的。YES 背景则为黑色,NO 背景则为透明。
    scale:所要创建图片的缩放比例。如果设置为0 ,则和[UIScreen mainScreen].scale效果一样,随着手机屏幕分辨率改变。
  • 调用方法renderInContext:将view的layer渲染到当前的绘制的上下文中。(Renders the layer and its sublayers into the specified context.)
  • UIGraphicsGetImageFromCurrentImageContext:基于当前位图的上下文返回图像。
  • UIGraphicsEndImageContext:从堆栈顶部删除当前基于位图的图形上下文。

以上就是iOS的截图代码了。但是对于WKWEBVIew(长图)来说,这个代码截不了完整的图片。因为WKwebView考虑到性能问题,并不会加载用户看不到的地方,所以会导致截图不完整。

WKWebView长截图

思路

这边先来说一下思路吧,我也是参考了网上很多实现方法总结的。我们可以看到WKWebView中有个子视图是WKScrollView。那么我们就可以通过拖动ScrollView来加载内容,与此同时截下图片。当ScrollView拖动到底之后,将全部截图拼接起来即可。

PS:当页面有悬浮栏时就会出现问题,在每一张截图中均会出现悬浮栏。目前我没有想到可以解决这个问题的方法,但思路大概是让WKwebVIew全部加载出来,然后进行截图。

实现

外部方法

/// 对WKWebView进行长截图(没有规避H5悬浮栏)/// @param webView 需要进行截图的webView/// @param completionHandler 截图完成回调 - (void)snapshotForWKWebView:(WKWebView *)webView CaptureCompletionHandler:(void (^)(UIImage * _Nonnull))completionHandler {    //1.添加遮罩层    UIView *snapshotView = [webView snapshotViewAfterScreenUpdates:YES];    snapshotView.frame = webView.frame;    [webView.superview addSubview:snapshotView];    //2.初始化数组    self.imgArr = [NSMutableArray array];    //3.进行截图操作    CGPoint savedCurrentContentOffset = webView.scrollView.contentOffset;    webView.scrollView.contentOffset = CGPointZero;    [self createSnapshotForWKWebView:webView offset:0.0 remaininGoffset_y:webView.scrollView.contentSize.height comletionBlock:^(UIImage *snapshotImg) {        webView.scrollView.contentOffset = savedCurrentContentOffset;        [snapshotView removeFromSuperview];        completionHandler(snapshotImg);    }];}
  1. 为了让用户看不到我们截图滚动的操作,这里使用snapshotViewAfterScreenUpdates 方法来实现屏幕快照进行遮盖。
  2. 初始化imgArr数组,之后用来存放每一部分截图。
  3. 保存当前WKScrollView.contentOffset以便截图操作结束后还原“案发现场”。
  4. WKScrollView.contentOffset设置为CGPointZero,调用截图方法开始截图。

截图操作方法

/// 绘制WKWebView长截图/// @param webView 所需要截图的WebView/// @param offset_y 当前scollView的y偏移量/// @param reOffset_y 剩余scollView的y偏移量/// @param completeBlock 回调块- (void)createSnapshotForWKWebView:(WKWebView *)webView offset:(float)offset_y remainingOffset_y:(float)reOffset_y comletionBlock:(void(^)(UIImage *snapshotImg))completeBlock{    //判断scrollView是否已经滚动到底    if (reOffset_y>0) {        //设置        [webView.scrollView setContentOffset:CGPointMake(0, offset_y) animated:NO];        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{            //对页面进行截图操作            UIGraphicsBeginImageContextWithOptions(webView.frame.size, YES, [UIScreen mainScreen].scale);            [webView.layer renderInContext:UIGraphicsGetCurrentContext()];            UIImage * img = UIGraphicsGetImageFromCurrentImageContext();            UIGraphicsEndImageContext();            //将截图添加进数组            [self.imgArr addObject:img];            //修改offsetY偏移量            CGFloat newOffset_y = offset_y + webView.scrollView.frame.size.height;            CGFloat newReOffset_y = reOffset_y - webView.frame.size.height;            [self createSnapshotForWKWebView:webView offset:newOffset_y remainingOffset_y:newReOffset_y comletionBlock:completeBlock];                    });    }else {        //合成截图为最终截图        UIView * containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, webView.frame.size.width, webView.scrollView.contentSize.height)];        CGFloat originYOfImgView = 0;        for (int i = 0; i<self.imgArr.count; i++) {            UIImageView * imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, originYOfImgView, webView.frame.size.width, webView.frame.size.height)];            UIImage * img = self.imgArr[i];            imgView.image = img;            originYOfImgView += webView.frame.size.height;            [containerView addSubview:imgView];        }        //添加合成视图        [webView.superview addSubview:containerView];        //处理最终合并截图        UIGraphicsBeginImageContextWithOptions(containerView.frame.size, YES, [UIScreen mainScreen].scale);        [containerView.layer renderInContext:UIGraphicsGetCurrentContext()];        UIImage * img = UIGraphicsGetImageFromCurrentImageContext();        UIGraphicsEndImageContext();        //移除合成视图        [containerView removeFromSuperview];        //返回截图        if (completeBlock) {            completeBlock(img);        }    }}
  1. 判断当前scrollView是否已经滚动到底部。
  2. 如果没滚动到底部,则再次设置scrollView.contentOffset到下一页进行截图。
  3. 这边给截图添加延迟,保证页面完全加载。截好的图片将放入数组。
  4. 如果scrollView已经到底部,则用一个容器视图,将所有的截图拼接并且展示。
  5. 最后再对容器视图进行截图操作,便可以得到完整的WKWebView页面截图了。

End

这个方法还是存在一定的问题,如果有大佬知道如何解决悬浮栏多次被截问题,请回复我~

来源地址:https://blog.csdn.net/qq_38863196/article/details/126361878

--结束END--

本文标题: iOS-长截图 (学习记录)

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

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

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

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

下载Word文档
猜你喜欢
  • iOS-长截图 (学习记录)
    目录 前言iOS — 绘制截图 WKWebView长截图思路实现外部方法截图操作方法 End 前言 长截图 —— 也就是可以截到超出屏幕的长图。在实现长图之前,我们先要了解一...
    99+
    2023-09-17
    ios 学习 webview objective-c
  • iOS实现简单长截图
    本文实例为大家分享了iOS实现简易的长截图的具体代码,供大家参考,具体内容如下 长截图的实现原理: 实际上是将view的内容绘制成图片,再将各个view绘制出来的图片拼接出来。 具体...
    99+
    2024-04-02
  • Python学习记录
    文章目录(1)学习Python基础(2)初识Python数据分析(3)初学Python网络爬虫(4)研读《从零开始学Python网络爬虫》,系统学习爬虫(5)初识机器学习,研读《机器学习Python实践》(6)研读《利用Pytho...
    99+
    2023-01-31
    Python
  • 『爬虫』学习记录
    ## 在学习爬虫中遇到很多坑,写出来供道友参考 出现诸如以下错误     ModuleNotFoundError: No module named 'js2xml'     NameError: name 'js2xml' is no...
    99+
    2023-01-31
    爬虫
  • Python学习记录day2
    今天,跟着Alex喝了心灵的鸡汤:Be a new gentlmen着装得体每天洗澡适当用香水女士优先不随地吐痰、不乱扔垃圾、不在人群中抽烟不大声喧哗不插队、碰到别人要说抱歉不在地铁上吃东西尊重别人的职业和劳动尊重别人隐私,不随便打听别人工...
    99+
    2023-01-31
    Python
  • python 20171115学习记录
    遍历列表def travel(string): index = 0 while index < len(string): letter = string[index] print letter index = index + 1a =...
    99+
    2023-01-31
    python
  • [Python学习记录]——Hello
       一直以来主要使用Java语言进行编程,开始学习Python起源于2012年亚马逊双十一购书大优惠的活动中为了补齐优惠额度,正好亚马逊给推荐《Python入门基础》一书。   一年时间过去了,书是翻了翻,看了看,心里和Java做了写比...
    99+
    2023-01-31
    Python
  • Python学习记录-20160108
    今日学习记录:f = open("song2", "w", encoding="UTF-8")#文件句柄,以写的模式打开文件,如果没有,就新建一个文件 f.write("我爱北京天安门,")#写入语句 f.write("\n天安门上太阳升....
    99+
    2023-01-31
    Python
  • Python tkinter 学习记录(
    最简的形式 from tkinter import * root = Tk() # 创建一个Tk实例 root.wm_title("标题") # 修改标题 root.mainloop() # 进入root的事件循环 运行结果 la...
    99+
    2023-01-30
    Python tkinter
  • Python学习记录day3
    Python学习记录 day3今天是银角大王武sir讲课。先回顾了上节课所学,然后讲到了面向对象思想。setset是一个无序且不重复,可嵌套的元素集合class set(object):     """     set() -> ne...
    99+
    2023-01-31
    Python
  • 记录我的Python学习笔记
    不想再像以前那样,什么都从头开始学习语法、总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身。 所以还是先熟练使用语言去进行开发,等足够熟悉了,再去研究语言本身(编译原理……)。 另外对于算法、...
    99+
    2023-01-31
    学习笔记 Python
  • HTML语法学习笔记:记录您的学习之旅
    HTML 简介 超文本标记语言 (HTML) 是互联网上网页的基础。它是一种标记语言,用于定义网页的结构和内容。学习 HTML 语法对于成为一名成功的网络开发者至关重要。 HTML 元素 HTML 中的基础构建块是元素。它们由一对尖括号...
    99+
    2024-03-09
    HTML、语法、学习、教程、网络开发
  • Python学习记录-paramiko模
    [TOC] paramiko模块基于SSH用于连接远程服务器并执行相关操作。 1. SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh = parami...
    99+
    2023-01-31
    Python paramiko
  • 《学习Java分布式:如何记录学习笔记提升学习效率?》
    学习Java分布式:如何记录学习笔记提升学习效率? Java是一种流行的编程语言,它可以用于开发各种应用程序,包括分布式系统。学习Java分布式是学习Java编程的重要部分,但是如何记录学习笔记以提高学习效率是一个值得探讨的问题。在本文中,...
    99+
    2023-07-27
    教程 分布式 学习笔记
  • 【每日一记3.16】python学习记录
    6.Python的列表    Python列表是python内置的数据对象之一    列表用【】包含,内有数据对象,每个数据对象以‘,’分隔,每个数据对象称为元素    python是一个有序的序列,支持嵌套    【】空列表,同时用lis...
    99+
    2023-01-31
    python
  • 我的python学习记录-eclipse
       在我们使用eclipse这样的ide开发python时,总是喜欢让编辑器做一些我们每次写程序都必须做的事。    在新建的python module源文件开头中我们每次可能都要写:       #!usr/bin/python    ...
    99+
    2023-01-31
    python eclipse
  • python全栈学习记录--3(2018
    一、Linux操作系统1、unix是目前世界上最稳定,安全的系统。是分时操作系统,多个联机终端和采用多道技术。2、开源代表代表公开,所有人可以编辑查看,但不代表免费。3、服务器要的是性能,稳定,效率,不间断运行。故LINUX更能胜任,WIN...
    99+
    2023-01-31
    python
  • Android Studio 学习记录-下拉框
    目录 下拉框控件 Spinner  数组适配器ArrayAdapter  简单适配器 SimpleAdapter         本节介绍下拉框的用法以及适配器的基本概念,结合对下拉框Spinner的使用说明分别阐述数 组适配器Array...
    99+
    2023-09-16
    android studio
  • C++ Primer学习记录之变量
    目录一.类型说明符二.变量名三.初始化总结变量的定义形式一般为:类型说明符,变量名和初始化, 一.类型说明符 类型说明符一般就是常用的int,double,char等系统自带的类型关...
    99+
    2024-04-02
  • python全栈学习记录--1(2018
    我是金融民工,现在行业更新速度越来越快,和编程结合的越来越紧密,搞程序化,量化,算法交易的越来越多,倍感压力。故想提升自己,跟上节奏。了解了各种语言的特点,咨询了一些朋友后,最终决定学习PYTHON。开始买了本python教程,但看了一大半...
    99+
    2023-01-31
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作