这篇文章主要为大家详细介绍了ios实现简单长截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了ios实现简易的长截图的具体代码,供大家参考,具体内容如下
长截图的实现原理:
实际上是将视角的内容绘制成图片,再将各个视角绘制出来的图片拼接出来。
具体代码:
将视角绘制成图片
func getImage(在视图中:UIView?)- UIImage?{
guard let view=view else { return nil }
let size=view.bounds.size
UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.main.scale)
查看。层。render(in:UIGraphicsGetCurrentContext()!)
视图.图层.内容=空
let image=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
返回图像
}
1.绘制状态栏
//先获取状态栏视角
func getStatusBar() - UIView?{
如果浮动(ui设备。当前。系统版本)!=13 {
守护字母状态栏管理器=ui应用程序。分享。关键窗口?windowScene?statusBarManager,
设状态栏管理器。值(forKey: createLocalStatusBar )为?n对象,
设状态栏=localstatusbar。值(forKey:“状态栏”)为?UIView else {return nil}
返回状态栏
}否则{
守护字母状态栏窗口=ui应用程序。分享。值(forKey:“状态栏窗口”)为?UIWindow else {return nil}
设状态栏=状态栏窗口。值(forKey:“状态栏”)为?UIView
返回状态栏
}
}
//再绘制成图片
let状态栏image=getImage(in:getstatus bar())
2.绘制导航栏(如果有的话)
设nav=VC。导航控制器{//表示有导航栏
let navBar=nav.navigationBar
let navBarImage=getImage(in:navBar)
}
在某些情况下,如自定义的导航栏,则需要另外自行获取视角再来绘制
3.绘制滚动视图
绘制滚动视图长图的时候,如果直接绘制的话,那么得到的图片就是滚动视图的框架。尺寸大小的图片,而没有滚动到的地方则不会绘制进去,所以要先将滚动视图的大小变成和内容大小一样
func getScrollViewImage(滚动视图:ui滚动视图?)- UIImage?{
if let scroll=scrollView {
让保存偏移=滚动。内容偏移量//保存偏移量,用于绘制图片完成后还原
let saveFrame=scroll.frame //保存设计
卷轴。内容偏移=重心点。零
卷轴。frame=CGRect(原点:保存帧。origin,size: scroll.contentSize) //设置大小和内容大小一致
UIGraphicsBeginImageContext(滚动。框架。尺寸)
UIGraphicsBeginImageContextWithOptions(CGSize(width:scroll。框架。尺寸。宽度、高度:滚动。框架。尺寸。height)、false、UIScreen.main.scale)
卷轴。层。render(in:UIGraphicsGetCurrentContext()!)
let scroll image=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
卷轴。内容偏移量=保存偏移量//还原偏移量,否则绘制图片之后,滚动视图偏移量不正确
scroll.frame=saveFrame //还原设计
返回滚动图像
}
返回零
}
到这里,其实最难的一步已经完成了,但是这个方法也不是完美的。当这个滚动视图添加到父视图的时候是添加约束的方式来确定大小和位置的时候,使用这个方法绘制出来的图片大小没有问题,但是内容却可能只有屏幕上显示出来的部分多一点,其他部分是空白。具体原因我也不太清楚,只要在绘制成图片之前将约束移除,绘制之后再添加回来
func getScrollViewImage(滚动视图:ui滚动视图?)- UIImage?{
if let scroll=scrollView {
让保存偏移=滚动。内容偏移量//保存偏移量,用于绘制图片完成后还原
let saveFrame=scroll.frame //保存设计
卷轴。内容偏移=重心点。零
卷轴。frame=CGRect(原点:保存帧。origin,size: scroll.contentSize) //设置大小和内容大小一致
let layouts=scroll.superview!约束//获取的是滚动视图的父容器的约束,这才是约束滚动视图大小和位置的正确约束
scroll.superview?移除约束(布局)
UIGraphicsBeginImageContext(滚动。框架。尺寸)
UIGraphicsBeginImageContextWithOptions(CGSize(width:scroll。框架。尺寸。宽度、高度:滚动。框架。尺寸。height)、false、UIScreen.main.scale)
卷轴。层。render(in:UIGraphicsGetCurrentContext()!)
let scroll image=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
卷轴。内容偏移量=保存偏移量//还原偏移量,否则绘制图片之后,滚动视图偏移量不正确
scroll.frame=saveFrame //还原设计
scroll.superview?添加约束(布局)//还原约束
返回滚动图像
}
返回零
}
如果项目中集成了卡扣套件的话可以用其给滚动视图重新设置约束,绘制图片结束后在还原也可以
func getScrollViewImage(滚动视图:ui滚动视图?)- UIImage?{
if let scroll=scrollView {
//.
let layouts=scroll.superview!约束//获取的是滚动视图的父容器的约束,这才是约束滚动视图大小和位置的正确约束
卷轴。SNP。重建约束{(make)in
make.top.left.right.equalTo(0)
制造。身高。等于(滚动。contentsize。高度)
}
//.
scroll.snp.removeConstraints()
scroll.superview?添加约束(布局)//还原约束
返回滚动图像
}
返回零
}
4.拼接图片
已经得到了所需要的各个部分的元素,这里按照上下位置将其拼接起来
函数组合图像(带upImage:UIImage?以及downImage:UIImage?)- UIImage?{
如果upImage==nil {
返回向下图像
}
if downImage==nil {
返回图像
}
警戒放松=upImage,
放下=放下图像else { return nil }
设size=CGSize(宽度:上。尺寸。宽度、高度:向上。尺寸。高度降低。尺寸。高度)
UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.main.scale)
设upRect=CGRect(原点:CGPoint(x: 0,y: 0),大小:up.size)
向上拉伸(向内:向上)
let down rect=CGRect(x:(up。尺寸。宽度向下。尺寸。width)/2,y:up rect。起源。垂直向上。尺寸。高度,宽度:down.size.width,高度:down.size.height)
下拉菜单(向内:向下)
let result=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
回送结果
}
这里是图片的上下拼接,左右拼接与这个类似,只需要计算好图片的左右位置即可。
效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。