前言:
加載一個pdf本地文件很簡單祝沸,使用UIWebView或者CGContextDrawPDFPage都可以實(shí)現(xiàn)笙什,但是要想多個PDF文件在一個ViewController上加載而又不失流暢該怎么辦呢堵幽?本文就來實(shí)現(xiàn)這一效果垫释。
先看效果圖:
2016-12-06 21_37_26.gif
實(shí)現(xiàn)思路:
拿到每個PDF的頁數(shù)拓挥,得到所有的PDF文件的總和
totalNum
菇爪,作為下標(biāo)的顯示數(shù)據(jù)算芯。每次翻頁,記住當(dāng)前的頁數(shù)在全部頁數(shù)的位置凳宙。當(dāng)翻到第一個PDF文件的最后一頁時熙揍,取出第二個PDF文件的第一頁作為下一頁展示,做無痕連接氏涩。
之后的展示同步驟2诈嘿,尤其要注意:下標(biāo)是在累加的基礎(chǔ)上的結(jié)果堪旧。
技術(shù)要點(diǎn):
- 得到PDF文件的頁數(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)前顯示頁數(shù),判斷出當(dāng)前顯示的是第幾個文件奖亚,然后取出對應(yīng)的后續(xù)文件補(bǔ)充顯示淳梦,我使用的是取下限以及上限的方法。例如:文件一和文件二都有3頁昔字,如果當(dāng)前顯示為4爆袍,說明到達(dá)了第二個文件的下限了,再往前翻頁就得取出第一個文件的最后一頁來顯示了作郭。如果顯示到第6頁的話陨囊,說明到達(dá)第二個文件的上限了。接下來如果往后翻的話就要取出第三個文件的第一頁來補(bǔ)充了夹攒。
3.繪制PDF內(nèi)容需要使用CGContextDrawPDFPage
,避免頁數(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