最近有很多关于绘制PDF的问题。
是的,你可以用UIWebView
很容易地渲染PDF,但这不能给你从一个好的PDF查看器所期望的性能和功能。
你可以绘制PDF页面到CALayer或到一个UIImage。苹果甚至有示例代码来展示如何绘制一个大的PDF 在可缩放UIScrollview中
但同样的问题不断出现。
用户界面图像方法:
UIImage
不光学
UIImages
从PDFcontext
限制/阻止使用它来创建
实时渲染新的缩放级别
CATiledLayer方法:
CALayer
:可以看到各个瓷砖的渲染(即使有一个tileSize微调)
CALayers
不能提前准备
时间(显示在屏幕外).一般来说,PDF查看器也占用大量内存。甚至监控苹果可缩放PDF示例的内存使用情况。
在我目前的项目中,我正在开发一个PDF查看器,并在一个单独的线程中呈现一个页面的UIImage
(这里也有问题!),并在规模为x1时呈现它。一旦比例为>1,CATiledLayer
渲染就开始了。iBooks采用了类似的重复查看方法,如果你滚动页面,你可以在不到一秒钟的时间内看到页面的低分辨率版本,然后就会出现清晰的版本。
我渲染2页页的每一面在焦点上,这样PDF图像就可以在开始绘制之前遮罩图层了。当页面距离焦点页面+2页时,页面再次被销毁。
有谁有任何见解,无论多么小或明显的提高性能/内存处理的绘图PDF ?或者这里讨论的其他问题?
< em >编辑:< / em >一些提示(来源- Luke Mcneice,VdesmedT,Matt Gallagher,Johann):
尽可能将任何媒体保存到磁盘。
如果在TiledLayers上渲染,请使用更大的tilesize
Init常用的数组用占位符对象,另一种设计方法是这一个
注意,图像将比CGPDFPageRef
更快地呈现
NSOperations
或GCD &块提前准备页面
李。< / p > < / >
在CGContextDrawPDFPage
之前调用CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
来减少绘图时的内存使用
用docRef初始化你的NSOperations
是一个坏主意(内存),将docRef包装成一个单例。
当你可以取消不必要的NSOperations
时,特别是当它们将使用内存时,注意不要让上下文打开!
回收页面对象并销毁未使用的视图
关闭任何打开的上下文,只要你不需要它们
在收到内存警告时释放并重新加载DocRef和任何页面缓存
其他PDF功能:
获取链接的目标(从/Dest
数组中获取页码)
搜索(和这里)(不适用于所有的pdf(一些只是显示奇怪的字符,我猜这是编码问题,但我不确定)-Credit BrainFeeder)
CALayer和Off-Screen Rendering -渲染下一页快速/平滑显示
文档
示例项目
UIScrollView
, CATiledLayer
UIScrollView
, CATiledView