扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
前段时间公司项目加了许多关于PDF文件操作的需求,其中包括 PDF文档的预览 、 PDF文件格式转换 、 从其他App获取文件 、 PDF文档的批注与修改 。这篇文章我会先记录下PDF文档的几种预览方式。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网站空间、营销软件、网站建设、保亭黎族网站维护、网站推广。
先看效果:
苹果的webView组件可以预览各种格式的文件,支持在线预览和本地预览,相比于安卓的webView控件简直就是一大神器,UIWebview使用起来也非常简单
QLPreviewController 是系统自带的文件预览控制器,QL全称 quick look 快速查看的意思,要使用QLPreviewController先得在文件中导入头文件 #import QuickLook/QuickLook.h ,并且实现其代理方法 QLPreviewControllerDelegate
使用UIDocumentInteractionController预览文件也得遵循 UIDocumentInteractionControllerDelegate 代理方法,UIDocumentInteractionController本身并不是一个控制器类,它直接继承 NSObject ,所以就不能直接push或者模态跳转了,所以需要使用它类方法提供的模态跳转函数
利用 CGContexDrawPDFPage 和 UIPageViewController 实现翻页浏览功能,这种方法只能加载本地的PDF文件,但是显示效果比其他几种炫酷很多。具体使用方法参考 iOS开发笔记——PDF的显示和浏览 这篇博客。也可以参考本文的 Demo
关于PDF文档的预览其实不止上文介绍的几种方法,还可以通过第三方SDK来加载并对PDF文档进行批注与修改,等有时间我会放在后面一起介绍。
2017年夏天,在苹果全球开发者大会(WWDC)上,苹果公司终于推出了针对于 iOS 的 PDFKit 支持。PDFKit 自从 MacOS 10.4 以来一直在 AppKit for MacOS 中。但 UIKit 却迟迟得不到支持,尽管苹果公司之前在 iBooks 和 Mail 中使用过 PDFKit , 但是该框架并未向开发人员开房。
PDFKit 包含了大量关于 PDF 相关的功能,例如,打开,修改,绘图和保存 PDF ,也包含了搜索文本。在 iOS 11 后,苹果终于开放了 PDFKit 。目前(虽然离 PDFKit 发布已经过了一年多),但是目前中文资料和 Demo 确实比较少,下面笔者就带着大家简单的了解一下 PDFKit。
主要核心功能如下:
PDFView
PDFDocument
PDFPage
PDFAnnotation
让我看到你们的双手, put your hands up!
引入 #import PDFKit/PDFKit.h ,创建 PDFView ,创建之前,首先要创建 PDFDocument ,这里通过文件路径 URl 进行创建。
创建 PDFView ,将 PDFDucument 对象赋给 PDFView。
至此,就实现了 PDF 的读取及显示。
首先获取 PDFDocument 的属性 PDFPage :
通过 PDFPage 的对象方法,可以获取 PDF 的缩略图,这里需传入图片的 size:
创建 collectionViewCell ,通过 collectionView 就可以实现一个大致的功能。
点击跳转
获取 cell 的点击事件,取出所点击的 PDFPage 对象,用下述方法进行跳转:
PDFOutline 是一个层级关系的对象,他表示 PDF 的大纲(也就是我们常用的书签)。每个 PDFOutline 对象都可通过 childAtIndex: 方法获取出他的孩子对象, 注意 ,这里需要先判断 numberOfChildren ,以确定该 outline 对象存在多少个孩子节点,避免下标超界引发的崩溃。
实现大纲功能
从 PDFDocument 中获取 PDFOutline
遍历 outline 孩子节点(默认只遍历一层)
当点击节点时,判断有无孩子节点,进行当前数组的新增或删除。
这里搜索功能主要靠下述方法实现
调用此方法之前,首先需将 PDFDocument 设置代理,通过 PDFDocument 的代理进行回调。获取 PDFSelection 对象,
再根据 selection 对象显示搜索内容。
调用下述方法即可对 PDFView 进行缩放,
实现双击缩放或还原:
这里通过设置 pdfView 的 scaleFactor 属性即可实现, 注意 : scaleFactorForSizeToFit 属性是当前 PDF 充满屏幕的比例。
GitHub :
本文原地址:
项目的开始我们必然要面临一些准备工作来做统筹布局(如: 网络API的封装、数据处理与UI布局的选择等等),我们这边选择的是Alamofire、ObjectMapper、AlamofireObjectMapper、ReactiveCocoa作为MVVM分层架构的现实:
1)运用ObjectMapper达到数据之间的相互转化;
2)结合Alamofire、ObjectMapper、AlamofireObjectMapper与ReactiveCocoa封装网络接口让数据可传递、可监听,为调用API接口服务。
3)通过viewmodel的属性(Property)和动作(Action)给view层提供必要的数据和执行的动作。
上面大致介绍了整个架构的现实原理,接下来我们要介绍的网络接口封装的第一步Router协议的实现。Router协议作为网络层现实的一部分,目的就是把API地址转化为更加容易理解的Router名称供其他地方使用,如:
这就是一个登录API的现实,RouterConvertible 就是我们所要现实的router协议,我们要让router协议具备网络请求的必要属性,实现如下:
从实际上考虑除了urlPath需要外部提供,headers和paramters是可选的,method和parameterEncoding可以给与默认值,在需要的时候在作调整,那么如何让这个协议现实这样的功能呢?
swift为我们提供了协议扩展,让我们轻松现实这样的功能,如下:
综上所述,我们的Router协议的实现已大功告成!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流