【Swift】把ScrollView转成PDF保存
2021-12-30 本文已影响0人
哗啦啦啦呃
iOS小白纪录的第一天
本文主要介绍怎么将App里的scrollView转成pdf并保存到本地文件中
-
一 将scrollview转成pdf
上代码,代码中的注释已经很详细了,从这位大佬的OC翻过来的
static func createPDFfromScrollView(view:UIScrollView) -> NSMutableData {
let origRect = view.frame
let origContent = view.contentSize
let origSuperView = view.superview
//创建一个新的用来显示的pdf的大小,并且为内容上下各预留了20的偏移
let rootRect = CGRect(x: 0,y: 0,width: 595,height: view.contentSize.height+40)
//重新计算scrollview的frame,新frame处于背景的中间,同时,为了能打印所有内容,将size设置为contentsize
let newScrollRect = CGRect(x: (595-view.contentSize.width)/2, y: 20, width: view.contentSize.width, height: view.contentSize.height)
//重新为scrollview设置frame,并从原父视图移除
view.removeFromSuperview()
view.frame = newScrollRect
//设置背景图,这里的背景图宽度为A4的宽度595
let rootView = UIView(frame: rootRect)
rootView.backgroundColor = UIColor.white
//将需要打印的内容放置在新的背景图上
rootView.addSubview(view)
//声明存储打印数据的数据结构
let pdfdata:NSMutableData = NSMutableData()
//设置要打印出来的文件的宽高
UIGraphicsBeginPDFContextToData(pdfdata, rootRect, nil)
//开始打印
UIGraphicsBeginPDFPage()
let pdfContext = UIGraphicsGetCurrentContext()
rootView.layer.render(in: pdfContext!)
//结束打印
UIGraphicsEndPDFContext()
//将scrollview的frame与父视图设置为初始状态
view.frame = origRect
origSuperView?.addSubview(view)
//此处对可以进行对子视图的恢复,比如说图片视图的恢复显示
//输出打印数据,根据需要进行数据的存储或传输
return pdfdata
}
-
保存pdf到本地
上代码,同样已经在代码注释了,就不详解了
//获取沙箱路径
let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last
print(dir!)
//URL 追加 文件名
let path = dir?.appendingPathComponent(pdfname)
print(path!)
do {
//写文件到路径
try pdfdata.write(to: path!, options: .atomic)
self.saveState(message: "Save Success!")
} catch {
self.saveState(message: "Save Failed!")
}
saveState是笔者自己写的一个提示框,可有可无。
这里也贴一下代码:
//弹框:是否保存成功
func saveState(message str:String){
let alertController = UIAlertController(title: str,
message: nil, preferredStyle: .alert)
//显示提示框
self.viewController.present(alertController, animated: true, completion: nil)
//两秒钟后自动消失
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
self.viewController.presentedViewController?.dismiss(animated: false, completion: nil)
}
}
OK,这个时候,你的pdf已经保存到App的Documents文件夹下面了,接下来就是怎么看见它了
简短的介绍一下iOS程序的独立的文件系统(存储空间):每个iOS程序都有一个独立的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒。
沙盒中相关路径
- AppName.app 应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以不能在运行时对这个目录中的内容进行修改,否则会导致应用程序无法启动。
- Documents/ 保存应用程序的重要数据文件和用户数据文件等。用户数据基本上都放在这个位置(例如从网上下载的图片或音乐文件),该文件夹在应用程序更新时会自动备份,在连接iTunes时也可以自动同步备份其中的数据。
- Library:这个目录下有两个子目录,可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份.
Library/Caches: 保存应用程序使用时产生的支持文件和缓存文件(保存应用程序再次启动过程中需要的信息),还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录并且可能被其他工具清理掉其中的数据
Library/Preferences: 保存应用程序的偏好设置文件。NSUserDefaults类创建的数据和plist文件都放在这里。会被iTunes备份。 - tmp/: 保存应用运行时所需要的临时数据。不会被iTunes备份。iPhone重启时,会被清空。
解决方法
这需要你在你的 App 内的 Info.plist 中添加两个键值对,第一个是 UIFileSharingEnabled,这个可以使 iTunes 分享你文件夹内的内容;第二个是 LSSupportsOpeningDocumentsInPlace ,它保证了你文件夹内本地文件的获取权限,你需要将这两个键值对的值设置为 YES
如果不想保存到应用程序下面,可以直接调用系统的分享框去保存到任选的一个文件夹下面。
参考文档:
https://blog.csdn.net/lyz0925/article/details/104460366