使用PDFKit写一个基本的PDF阅读器

  • PDFKit相关类
  • 加载PDF文档
  • 显示PDF文档
    • 滚动控制
    • 缩放控制
  • 目录视图
  • 文档搜索
  • Annotation
  • 结束

WWDC 2017 苹果发布了一个新的关于PDF的库—PDFKit, 看起来很不错的样子,现在是时候学习一波了。

PDFKit相关类

PDFKit的相关类不多,用起来也很容易,比之前苹果的QuartzCore的C语言API使用起来容易太多了。相关类如下:

1、PDFDocument: 这个类的作用一目了然,它代表了一个PDF文档,可以使用它的初始化方法-initWithURL:

2、PDFView: 这个类是一个呈现PDF文档的UIView,包括所有的UI操作,使用-initWithDocument:方法进行初始化

3、 PDFThumbnailView: 这个类是一个关于PDF的缩略视图。通过设置其PDFView属性来关联一个PDFView

4、 PDFPage: 表示了当前PDF文档中的一页

5、 PDFOutline: 表示了整个PDF文档的轮廓,比如有些带目录标签的文档

6、 PDFAnnotation: 表示了PDF文档中加入的一些标注,如下划线,删除线,备注等等。

7、 PDFSelection:表示了PDF文档中的一个选区

8、 PDFAction: 表示了PDF文档中的一个动作,比如点击一个链接等等

加载PDF文档

PDFDocument代表了一个PDF文档,加载的代码如下所示:

PDFDocument文档中包含了PDF文档的每一页,一般的PDF App在文档页面,都有一个缩略图,可以使用PDFPage的-thumbnailOfSize:forBox:方法来生成一个缩略图,如下所示:

使用PDFKit写一个基本的PDF阅读器_第1张图片

我们使用PDFDocument的pageAtIndex:方法,获取到首页的PDFPage对象,然后调用PDFPage对应的方法即可拿到缩略图,效果如下所示:

使用PDFKit写一个基本的PDF阅读器_第2张图片

显示PDF文档

加载PDF完成之后,下一步要做的就是显示PDF文档,这该是PDFView的功劳了。只要使用PDFView的初始化方法即可。实现的UI如下所示:

使用PDFKit写一个基本的PDF阅读器_第3张图片

其中,我们可以通过 displayMode 属性对显示的样式进行控制,取值如下:

typedef enum PDFDisplayMode : NSInteger {
    //单页显示
    kPDFDisplaySinglePage = 0,
    //单页连续
    kPDFDisplaySinglePageContinuous = 1,
    //双页显示
    kPDFDisplayTwoUp = 2,
    //双页连续
    kPDFDisplayTwoUpContinuous = 3
} PDFDisplayMode;

使用 displayPageBreaks 控制是否显示页面之间的分隔符。

滚动控制

可以看到,右边有一个页面指示器,当页面滚动的时候指示器会跟随着对应的滚动,并且指示当前是哪个页面,我们输出PDFView的subViews可以看到,其实里面包含一个PDFScrollView,其实就是一个UIScrollView,但是问题来了,本来UIScrollView我们可以使用代理,不过我们可以使用KVO监听contentOffset属性来控制,通过contentSize及屏幕高度的比例来移动Cursor,如下所示:

使用PDFKit写一个基本的PDF阅读器_第4张图片

使用PDFKit写一个基本的PDF阅读器_第5张图片

缩放控制

我们在进入PDF文档的时候,可以看到PDF的大小是适配屏幕的,调整缩放,我们使用 scaleFactorminScaleFactormaxScaleFactor 来控制,PDFView里面有一个 autoScales 属性,本来以为他是自动适配屏幕的,结果发现不是。只好自己来实现了,计算正确的scaleFactor的代码如下:

使用PDFKit写一个基本的PDF阅读器_第6张图片

其中_xContentSize是当scaleFactor为1.0的时候的contentSize.width。

目录视图

PDFOutline代表的是整个PDF文档的轮廓,其中PDFDocument中的属性 outlineRoot 表示了整个PDF文档的根目录,我们可以使用PDFOutline中的 label 获取目录的相关文档,使用numberOfChilds 方法可以获取到子目录标签的数目,基本代码如下:

使用PDFKit写一个基本的PDF阅读器_第7张图片

当我们点击一项的时候,应该要跳转到对应的地方,PDFDestination表示一个PDF文档上的地点,我们使用PDFView的goToDestination方法,跳到相应的地方去,如下所示:

使用PDFKit写一个基本的PDF阅读器_第8张图片

如下所示:

使用PDFKit写一个基本的PDF阅读器_第9张图片

文档搜索

文档搜索也很简单,使用-findString:withOptions:方法,可以进行搜索,代码如下所示:

使用PDFKit写一个基本的PDF阅读器_第10张图片

其中,我们可以设置PDFSelection中的 color 属性,可以调整选区的颜色。当搜索出来之后,可以使用-setHighlightedSelections:方法对搜索到的字符串进行高亮显示,同时可以使用-scrollSelectionToVisible:方法来滚动到选区,但是我发现不起作用,不知道为什么,可能是我使用方法不对。

Annotation

添加Annotation的方法如下:

使用PDFKit写一个基本的PDF阅读器_第11张图片

添加Annotation的代码几乎都一样的,其中PDFBorder可以设置线宽和线型,比如虚线、实线等。同样的我在使用的时候发现设置lineWidth并不管用,不知道是不是我的使用方法不对,还是怎么样的,完全不起作用,我通过设置bounds方法的高度来设置线宽。

使用Annotation还可以有很多功能,看WWDC17视频,甚至可以在PDF中加入文本TextView,Button,RadioButton,CheckBox等,简直强大。

结束

PDFKit确实是一个不错的库,很轻松的就能实现一个PDF阅读器,比以前的那个框架容易了不少,除了牛逼,我还能说什么呢?

你可能感兴趣的:(iOS开发,PDFKit)