前言:
加载一个pdf本地文件很简单,使用UIWebView或者CGContextDrawPDFPage都可以实现,但是要想多个PDF文件在一个ViewController上加载而又不失流畅该怎么办呢?本文就来实现这一效果。
先看效果图:

实现思路:
拿到每个PDF的页数,得到所有的PDF文件的总和 totalNum
,作为下标的显示数据。
每次翻页,记住当前的页数在全部页数的位置。当翻到第一个PDF文件的最后一页时,取出第二个PDF文件的第一页作为下一页展示,做无痕连接。
之后的展示同步骤2,尤其要注意:下标是在累加的基础上的结果。
技术要点:
- 得到PDF文件的页数:
1 2 3 4 5
| NSString *filename = @"1.pdf"; CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (__bridge CFStringRef)filename, NULL, NULL); CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); CFRelease(pdfURL); NSInteger indexSum = CGPDFDocumentGetNumberOfPages(pdfDocument);
|
2.根据当前显示页数,判断出当前显示的是第几个文件,然后取出对应的后续文件补充显示,我使用的是取下限以及上限的方法。例如:文件一和文件二都有3页,如果当前显示为4,说明到达了第二个文件的下限了,再往前翻页就得取出第一个文件的最后一页来显示了。如果显示到第6页的话,说明到达第二个文件的上限了。接下来如果往后翻的话就要取出第三个文件的第一页来补充了。
3.绘制PDF内容需要使用CGContextDrawPDFPage
,避免页数太多的时候卡顿。
1 2 3 4 5 6 7 8 9 10 11
| CGContextRef context = UIGraphicsGetCurrentContext(); //调整坐标系 CGContextTranslateCTM(context, 0.0, self.bounds.size.height);//先垂直下移height高度 CGContextScaleCTM(context, 1.0, -1.0);//再垂直向上翻转 //绘制pdf内容 CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdfDocument, page); CGContextSaveGState(context); CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pageRef, kCGPDFCropBox, self.bounds, 0, true); CGContextConcatCTM(context, pdfTransform); CGContextDrawPDFPage(context, pageRef); CGContextRestoreGState(context);
|
github项目地址: https://github.com/wang-qiuyu/PDFtest