博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用CATiledLayer优化PDF展示
阅读量:6038 次
发布时间:2019-06-20

本文共 2004 字,大约阅读时间需要 6 分钟。

iOS中提供了一个非常好的PDF解析类库,可以很方便地使用CGPDFDocumentRef读取PDF文件内容。但是由于PDF文件一般尺寸都比较大,一次性把内容展示出来,比较占内存。为了优化展示而不浪费不必要的内存消耗,可以使用视图UIView的CALayer机制,可以使用CATiledLayer把PDF页面分成好几个区域,展示哪个区域就调用哪个区域的数据,可以大大节省内存开销。对大尺寸的图像,也可以使用这种原理来处理。

首先使用CGPDFDocumentRef读取PDF文件,使用CGPDFDocumentGetPage方法获取到指定页的CGPDFPageRef。
下面提供这个思路的主要代码片段:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    CGPDFPageRef pageRef = myPageRef
        if (pageRef != nil && ctx != nil) {
            [(NSObject*)pageRef retain];
            //prevent releasing while drawing
            CGPDFPageRetain(pageRef);
            CGContextRetain(ctx);
            CGContextSaveGState(ctx);
            
            CGRect bounding = layer.bounds;            
            CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
            CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
            CGContextTranslateCTM(ctx, 0.0, bounding.size.height);
            CGContextScaleCTM(ctx, 1.0, -1.0);    
            CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(pageRef, kCGPDFCropBox, bounding, 0, true));
            CGContextDrawPDFPage(ctx, pageRef);
            CGContextRestoreGState(ctx);
            CGContextRelease(ctx);
            CGPDFPageRelease(pageRef);
            [(NSObject*)pageRef release];
        }
        
}
以上代码就显示出PDF内容了。
继续完善以上代码。
由于PDF读取一般速度比较慢,因此用户会有一个等待的时间,此时屏幕就会显示空白,为了弥补这个不好看的效果,可以考虑在展示层CALayer后增加一个背景图片CALayer。
//设置背景层
self.imageLayer = [CALayer layer];
//设置层的图像        
self.imageLayer.contents = (id) yourUIImage.CGImage;
//将背景层添加到视图中去
[self.layer addSublayer:self.imageLayer];
另外,由于显示PDF的速度也不一定很快,尤其在切换PDF页面时。其实展示PDF最终希望是能够看清楚内容,如果缩放的比例大小,看不清内容的话,这种展示对用户来说也没有多少实际意义。因此可以利用这点做一些技巧性的优化,当PDF缩放比例太小时,就不要显示真正的PDF内容,而显示一个自己的图像,或者页面缩略图也行。优化上面方法drawLayer:的代码:
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    if(self.zoomScale < 2.0 ){
        CGImageRef  cgImage = yourUIImage.CGImage;
        if( cgImage != nil )
        {        
            CGContextSaveGState( context );
            CGRect bounding = self.bounds;
            CGContextTranslateCTM(ctx, 0.0, bounding.size.height);
            CGContextScaleCTM(ctx, 1.0, -1.0);    
            CGContextDrawImage( context, bounding, cgImage );
            CGContextRestoreGState( context );
        }
    }else {
        CGPDFPageRef pageRef = myPageRef
        ...
    }
}

转载于:https://www.cnblogs.com/pengyingh/articles/2419182.html

你可能感兴趣的文章
表单文件上传与文件下载
查看>>
下午考
查看>>
创建字符设备的三种方法
查看>>
走在网页游戏开发的路上(六)
查看>>
nginx 配置的server_name参数(转)
查看>>
Uva592 Island of Logic
查看>>
C++基础代码--20余种数据结构和算法的实现
查看>>
footer固定在页面底部的实现方法总结
查看>>
nginx上传文件大小
查看>>
数字通信原理笔记(一)---概述
查看>>
HDU 2243 考研路茫茫——单词情结(自动机)
查看>>
Dubbo OPS工具——dubbo-admin & dubbo-monitor
查看>>
Dungeon Master ZOJ 1940【优先队列+广搜】
查看>>
Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
查看>>
2013年7月12日“修复 Migration 测试发现的 Bug”
查看>>
学习vue中遇到的报错,特此记录下来
查看>>
CentOS7 编译安装 Mariadb
查看>>
jstl格式化时间
查看>>
一则关于运算符的小例
查看>>
centos7 ambari2.6.1.5+hdp2.6.4.0 大数据集群安装部署
查看>>