iOS 多个PDF的加载显示

前言:

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

先看效果图:
2016-12-06 21_37_26.gif

实现思路:

  1. 拿到每个PDF的页数,得到所有的PDF文件的总和 totalNum ,作为下标的显示数据。

  2. 每次翻页,记住当前的页数在全部页数的位置。当翻到第一个PDF文件的最后一页时,取出第二个PDF文件的第一页作为下一页展示,做无痕连接。

  3. 之后的展示同步骤2,尤其要注意:下标是在累加的基础上的结果。


技术要点:

  1. 得到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

你可能感兴趣的:(iOS 多个PDF的加载显示)