前言:
加载一个pdf本地文件很简单,使用UIWebView或者CGContextDrawPDFPage都可以实现,但是要想多个PDF文件在一个ViewController上加载而又不失流畅该怎么办呢?本文就来实现这一效果。
先看效果图:
实现思路:
拿到每个PDF的页数,得到所有的PDF文件的总和
totalNum
,作为下标的显示数据。每次翻页,记住当前的页数在全部页数的位置。当翻到第一个PDF文件的最后一页时,取出第二个PDF文件的第一页作为下一页展示,做无痕连接。
之后的展示同步骤2,尤其要注意:下标是在累加的基础上的结果。
技术要点:
- 得到PDF文件的页数:
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
,避免页数太多的时候卡顿。
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/xiaochenyi/PDFtest