FAST和精益PDF查看器用于iPhone/iPad/IOS-提示和提示?

FAST和精益PDF查看器用于iPhone/iPad/IOS-提示和提示?

最近有很多关于绘制PDF的问题。

是的,您可以很容易地使用UIWebView但这不能给出您期望的良好PDF查看器的性能和功能。

您可以绘制PDF页面。给一个卡莱尔到UIImage..苹果甚至有示例代码来展示如何绘制一个大的PDF在可缩放的UIScrollview中

但同样的问题不断出现。

UIImage方法:

  1. PDF在一个

    UIImage

    不要像用图层法那样进行光学缩放。
  2. CPU和内存在生成

    UIImages

    PDFcontext

    限制/防止使用它来创建新的缩放级别的实时呈现。

CATILedLayer法:

  1. 有一个很大的开销(时间)将完整的PDF页绘制到

    CALayer

    :可以看到单个瓷砖的呈现(即使是平铺大小的调整)。
  2. CALayers

    不能提前准备(在屏幕外呈现)。

一般来说,PDF阅读器的内存也很重。甚至监控苹果的可缩放PDF示例的内存使用情况。

在我当前的项目中,我正在开发一个PDF查看器,并呈现一个UIImage一个单独的线程中的页面(这里也有问题!)在刻度为x1的时候呈现出来。CATiledLayer一旦渲染的比例大于1,iBooks就会采用类似的双取方式,就像滚动页面一样,在清晰的版本出现之前,您可以在不到一秒钟的时间内看到页面的较低分辨率版本。

我呈现每页2页的焦点,这样PDF图像就可以在开始绘图之前掩盖图层,当页面离焦点页面+2页时,页面就会再次被销毁。

有没有人有任何洞察力,无论多小或多明显,都能提高PDF的性能/内存处理能力吗?或者这里讨论的其他问题?

编辑:一些小贴士(信用-卢克·麦克奈斯,维德梅德·T,马特·加拉格尔,约翰):

  • 可以时将任何媒体保存到磁盘。

  • 如果在平铺上渲染,请使用更大的平铺尺寸

  • 在经常使用占位符对象的数组中,另一种设计方法是这一个

  • 注意,图像呈现速度比CGPDFPageRef

  • 使用NSOperations或GCD&砌块提前准备页面。

  • 打电话CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);以前CGContextDrawPDFPage减少绘图时的内存使用

  • 在你的NSOperations使用docRef是个坏主意(内存),将docRef包装成一个单例。

  • 取消不必要NSOperations当你可以的时候,特别是如果他们要使用内存的话,小心不要让上下文打开!

  • 回收页面对象并销毁未使用的视图

  • 在不需要任何开放上下文时立即关闭它们

  • 接收内存警告释放和重新加载DocRef和任何页面缓存

其他PDF功能:

文献资料

示例项目


沧海一幻觉
浏览 394回答 3
3回答

catspeake

我使用近似相同的方法构建了这样的应用程序,除了:我将生成的映像缓存在磁盘上,并且总是在一个单独的线程中预先生成两到三个映像。我不会用UIImage但是,当缩放为1时,则在图层中绘制图像。当发出内存警告时,这些瓷砖将自动释放。每当用户开始缩放时,我将获取CGPDFPage并使用适当的CTM进行渲染。代码- (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context就像:CGAffineTransform currentCTM = CGContextGetCTM(context);    if (currentCTM.a == 1.0 && baseImage) {     //Calculate ideal scale     CGFloat scaleForWidth = baseImage.size.width/self.bounds.size.width;     CGFloat scaleForHeight = baseImage.size.height/self.bounds.size.height;      CGFloat imageScaleFactor = MAX(scaleForWidth, scaleForHeight);     CGSize imageSize = CGSizeMake(baseImage.size.width/imageScaleFactor, baseImage.size.height/imageScaleFactor);     CGRect imageRect = CGRectMake((self.bounds.size.width-imageSize.width)/2, (self.bounds.size.height-imageSize.height)/2, imageSize.width, imageSize.height);     CGContextDrawImage(context, imageRect, [baseImage CGImage]);} else {     @synchronized(issue) {          CGPDFPageRef pdfPage = CGPDFDocumentGetPage(issue.pdfDoc, pageIndex+1);         pdfToPageTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFMediaBox, layer.bounds, 0, true);         CGContextConcatCTM(context, pdfToPageTransform);             CGContextDrawPDFPage(context, pdfPage);     }}问题的对象是CGPDFDocumentRef..同步访问pdfDoc属性,因为我在接收内存警告时释放它并重新创建它。似乎CGPDFDocumentRef对象执行一些我没有找到的内部缓存。

Smart猫小萌

自iOS 11,您可以使用名为PDFKit用于显示和操作PDF。导入PDFKit之后,应该初始化PDFView使用本地或远程URL,并将其显示在视图中。if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") {     let pdfView = PDFView(frame: view.frame)     pdfView.document = PDFDocument(url: url)     view.addSubview(pdfView)}在Apple Developer文档中阅读更多关于PDFKit的信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS