我的编程空间,编程开发者的网络收藏夹
学习永远不晚

iOS实现简单长截图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

iOS实现简单长截图

本文实例为大家分享了iOS实现简易的长截图的具体代码,供大家参考,具体内容如下

长截图的实现原理:

实际上是将view的内容绘制成图片,再将各个view绘制出来的图片拼接出来。

具体代码:

将view绘制成图片

func getImage(in view:UIView?) -> UIImage? {
    guard let view = view else {return nil}
    let size = view.bounds.size
    UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
    view.layer.render(in: UIGraphicsGetCurrentContext()!)
    view.layer.contents = nil
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

1.绘制状态栏

// 先获取状态栏view
func getStatusBar() -> UIView? {
    if Float(UIDevice.current.systemVersion)! >= 13 {
        guard let statusBarManager = UIApplication.shared.keyWindow?.windowScene?.statusBarManager,
              let localStatusBar = statusBarManager.value(forKey: "createLocalStatusBar") as? NSObject,
              let statusBar = localStatusBar.value(forKey: "statusBar") as? UIView else {return nil}
        return statusBar
    } else {
        guard let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow  else {return nil}
        let statusBar = statusBarWindow.value(forKey: "statusBar") as? UIView
        return statusBar
    }
}

// 再绘制成图片
let statusBarImage = getImage(in: getStatusBar())

2.绘制导航栏(如果有的话)

if let nav = vc.navigationController { // 表示有导航栏
    let navBar = nav.navigationBar
    let navBarImage = getImage(in: navBar)
}

在某些情况下,如自定义的导航栏,则需要另外自行获取view再来绘制

3.绘制ScrollView

绘制scrollview长图的时候,如果直接绘制的话,那么得到的图片就是scrollview的frame.size大小的图片,而没有滚动到的地方则不会绘制进去,所以要先将scrollview的size变成和contentSize一样

func getScrollViewImage(scrollView:UIScrollView?) -> UIImage? {
    if let scroll = scrollView {
        let saveOffset = scroll.contentOffset // 保存偏移量,用于绘制图片完成后还原
        let saveFrame = scroll.frame // 保存frame
        scroll.contentOffset = CGPoint.zero
        scroll.frame = CGRect(origin: saveFrame.origin, size: scroll.contentSize) // 设置size和contentSize一致
        
        UIGraphicsBeginImageContext(scroll.frame.size)
        UIGraphicsBeginImageContextWithOptions(CGSize(width: scroll.frame.size.width, height: scroll.frame.size.height), false, UIScreen.main.scale)
        scroll.layer.render(in: UIGraphicsGetCurrentContext()!)
        let scrollImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        scroll.contentOffset = saveOffset // 还原偏移量,否则绘制图片之后,scrollview偏移量不正确
        scroll.frame = saveFrame // 还原frame
        return scrollImage
    }
    return nil
}

到这里,其实最难的一步已经完成了,但是这个方法也不是完美的。当这个scrollview添加到父视图的时候是添加约束的方式来确定大小和位置的时候,使用这个方法绘制出来的图片大小没有问题,但是内容却可能只有屏幕上显示出来的部分多一点,其他部分是空白。具体原因我也不太清楚,只要在绘制成图片之前将约束移除,绘制之后再添加回来

func getScrollViewImage(scrollView:UIScrollView?) -> UIImage? {
    if let scroll = scrollView {
        let saveOffset = scroll.contentOffset // 保存偏移量,用于绘制图片完成后还原
        let saveFrame = scroll.frame // 保存frame
        scroll.contentOffset = CGPoint.zero
        scroll.frame = CGRect(origin: saveFrame.origin, size: scroll.contentSize) // 设置size和contentSize一致
        let layouts = scroll.superview!.constraints // 获取的是scrollview的父容器的约束,这才是约束scrollview大小和位置的正确约束
        scroll.superview?.removeConstraints(layouts)
        
        UIGraphicsBeginImageContext(scroll.frame.size)
        UIGraphicsBeginImageContextWithOptions(CGSize(width: scroll.frame.size.width, height: scroll.frame.size.height), false, UIScreen.main.scale)
        scroll.layer.render(in: UIGraphicsGetCurrentContext()!)
        let scrollImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        scroll.contentOffset = saveOffset // 还原偏移量,否则绘制图片之后,scrollview偏移量不正确
        scroll.frame = saveFrame // 还原frame
        scroll.superview?.addConstraints(layouts) // 还原约束
        return scrollImage
    }
    return nil
}

如果项目中集成了SnapKit的话可以用其给scrollview重新设置约束,绘制图片结束后在还原也可以

func getScrollViewImage(scrollView:UIScrollView?) -> UIImage? {
    if let scroll = scrollView {
        
        // ......

        let layouts = scroll.superview!.constraints // 获取的是scrollview的父容器的约束,这才是约束scrollview大小和位置的正确约束
        scroll.snp.remakeConstraints { (make) in
            make.top.left.right.equalTo(0)
            make.height.equalTo(scroll.contentSize.height)
        }
        
        // ...... 
        
        scroll.snp.removeConstraints()
        scroll.superview?.addConstraints(layouts) // 还原约束
        
        return scrollImage
    }
    return nil
}

4.拼接图片

已经得到了所需要的各个部分的元素,这里按照上下位置将其拼接起来

func combineImages(with upImage:UIImage?, and downImage:UIImage?) -> UIImage? {
    if upImage == nil {
        return downImage
    }
    if downImage == nil {
        return upImage
    }
    guard let up = upImage,
          let down = downImage else {return nil}
    let size = CGSize(width: up.size.width, height: up.size.height + down.size.height)
    UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
    
    let upRect = CGRect(origin: CGPoint(x: 0, y: 0), size: up.size)
    up.draw(in: upRect)
    let downRect = CGRect(x: (up.size.width - down.size.width) / 2, y: upRect.origin.y + upRect.size.height, width: down.size.width, height: down.size.height)
    down.draw(in: downRect)
    
    let result = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return result
}

这里是图片的上下拼接,左右拼接与这个类似,只需要计算好图片的左右位置即可。

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

iOS实现简单长截图

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

下载Word文档

猜你喜欢

iOS简单实现轮播图效果

这篇文章主要为大家详细介绍了iOS简单实现轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

原生JS实现简单屏幕截图

本文主要介绍了原生JS实现简单屏幕截图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-15

原生JS怎么实现简单屏幕截图

这篇文章主要介绍“原生JS怎么实现简单屏幕截图”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“原生JS怎么实现简单屏幕截图”文章能帮助大家解决问题。了解 HTML5 中的 CanvasHTML5 中的
2023-07-06

iOS实现简单抽屉效果

抽屉效果 所谓抽屉效果就是三个视图,向右拖拽显示左边的视图,向左拖拽显示右边的视图,当拖拽大于屏幕的一半时最上面的视图会自动定位到一边,当点击左边或右边视图时会最上面视图会自动复位。 效果如图:三个视图(左边:浅灰色视图、右边:品红视图、主
2022-05-21

springmvc实现简单的拦截器

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实
2023-05-31

iOS实现图片水印与简单封装示例代码

前言: 常用的许多软件中图片加水印的功能是非常常见的,如微博,微信,今日头条等等图片上都会有。 首先我们了解一下什么是水印及其作用? 水印:在图片上加的防止他人盗图的半透明logo、文字、图标水印的作用:告诉你这个图片从哪来的,主要是一些网
2022-05-24

iOS开发实现简单抽屉效果

这篇文章主要为大家详细介绍了iOS开发实现简单抽屉效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

iOS实现简单的头部缩放功能

本文通过实例代码给大家介绍了iOS实现简单的头部缩放功能。实现思路有头部视图,滚动视图,控制头部动画等多个示例代码块,大家可以参考下本文。 简单实现并集成一个头部缩放的功能,适用于UIScrollView以及其子类。 头部伴随模糊效果放大缩
2022-06-03

iOS怎么实现简单计算器功能

本篇文章给大家分享的是有关iOS怎么实现简单计算器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。// ZYAppDelegate.m// Calculator////
2023-06-29

iOS简单抽屉效果的实现方法

这篇文章主要为大家详细介绍了iOS简单抽屉效果的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

iOS中读写锁的简单实现方法实例

目录废话开篇思考一、对于锁的类型的理解思考二、读写锁的实现逻辑思考三、简单封装读写锁,满足读写逻辑总结废话开篇 iOS 下的多线程的技术的应用衍生出了锁的机制,试想,如果 iOS 下没有多线程的概念,所有的代码都会在同步环境下执行,那么,也
2022-06-04

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录