美文网首页零基础学习Swift
【Swift】把ScrollView转成PDF保存

【Swift】把ScrollView转成PDF保存

作者: 哗啦啦啦呃 | 来源:发表于2021-12-30 17:00 被阅读0次

    iOS小白纪录的第一天

    本文主要介绍怎么将App里的scrollView转成pdf并保存到本地文件中

    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

    image.png

    如果不想保存到应用程序下面,可以直接调用系统的分享框去保存到任选的一个文件夹下面。

    参考文档:
    https://blog.csdn.net/lyz0925/article/details/104460366

    相关文章

      网友评论

        本文标题:【Swift】把ScrollView转成PDF保存

        本文链接:https://www.haomeiwen.com/subject/wvagqrtx.html