前言:
加載一個(gè)pdf本地文件很簡(jiǎn)單,使用UIWebView或者CGContextDrawPDFPage都可以實(shí)現(xiàn),但是要想多個(gè)PDF文件在一個(gè)ViewController上加載而又不失流暢該怎么辦呢?本文就來(lái)實(shí)現(xiàn)這一效果。
先看效果圖:

實(shí)現(xiàn)思路:
拿到每個(gè)PDF的頁(yè)數(shù),得到所有的PDF文件的總和
totalNum,作為下標(biāo)的顯示數(shù)據(jù)。每次翻頁(yè),記住當(dāng)前的頁(yè)數(shù)在全部頁(yè)數(shù)的位置。當(dāng)翻到第一個(gè)PDF文件的最后一頁(yè)時(shí),取出第二個(gè)PDF文件的第一頁(yè)作為下一頁(yè)展示,做無(wú)痕連接。
之后的展示同步驟2,尤其要注意:下標(biāo)是在累加的基礎(chǔ)上的結(jié)果。
技術(shù)要點(diǎn):
- 得到PDF文件的頁(yè)數(shù):
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.根據(jù)當(dāng)前顯示頁(yè)數(shù),判斷出當(dāng)前顯示的是第幾個(gè)文件,然后取出對(duì)應(yīng)的后續(xù)文件補(bǔ)充顯示,我使用的是取下限以及上限的方法。例如:文件一和文件二都有3頁(yè),如果當(dāng)前顯示為4,說(shuō)明到達(dá)了第二個(gè)文件的下限了,再往前翻頁(yè)就得取出第一個(gè)文件的最后一頁(yè)來(lái)顯示了。如果顯示到第6頁(yè)的話(huà),說(shuō)明到達(dá)第二個(gè)文件的上限了。接下來(lái)如果往后翻的話(huà)就要取出第三個(gè)文件的第一頁(yè)來(lái)補(bǔ)充了。
3.繪制PDF內(nèi)容需要使用CGContextDrawPDFPage,避免頁(yè)數(shù)太多的時(shí)候卡頓。
CGContextRef context = UIGraphicsGetCurrentContext();
//調(diào)整坐標(biāo)系
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);//先垂直下移height高度
CGContextScaleCTM(context, 1.0, -1.0);//再垂直向上翻轉(zhuǎn)
//繪制pdf內(nèi)容
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項(xiàng)目地址: https://github.com/xiaochenyi/PDFtest