最近、PDFの描画について多くの質問があります。
はい、PDFをで簡単にレンダリングできますUIWebView
が、これは優れたPDFビューアに期待するパフォーマンスと機能を提供できません。
PDFページをCALayerまたはUIImageに描画できます。Appleには、ズーム可能なUIScrollviewで大きなPDF を描画する方法を示すサンプルコードさえあります
しかし、同じ問題が増え続けています。
UIImageメソッド:
- PDF
UIImage
は、レイヤーアプローチと同様に光学的にスケーリングされません。 -
制限
UIImages
からの生成でCPUとメモリがヒットしPDFcontext
、新しいズームレベルのリアルタイムレンダリングを作成するためにそれを使用できなくなります。
CATiledLayerメソッド:
- PDFページ全体をaに描画すると、かなりのオーバーヘッド(時間)
CALayer
が発生します。個々のタイルがレンダリングで表示されます(tileSizeを微調整しても) CALayers
事前に準備できません(画面外でレンダリングされます)。
一般に、PDFビューアもメモリをかなり消費します。Appleのズーム可能なPDFの例のメモリ使用量も監視します。
現在のプロジェクトでは、PDFビューアを開発UIImage
していて、別のスレッドでページのをレンダリングしています(ここでも問題です)、スケールがx1のときにページを表示しています。CATiledLayer
スケールが1を超えると、レンダリングが開始されます。iBooksも同様のダブルテイクアプローチを採用しており、ページをスクロールすると、鮮明なバージョンが表示される前に1秒未満でページの低解像度バージョンを表示できます。
ページの各側にフォーカスがある2ページをレンダリングして、PDFイメージが描画を開始する前にレイヤーをマスクできるようにします。フォーカスされたページから+2ページ離れると、ページは再び破棄されます。
描画PDFのパフォーマンス/メモリ処理を改善するためにどれほど小さくても明白でも、誰かが洞察を持っていますか?またはここで議論された他の問題?
編集:いくつかのヒント(Credit- Luke Mcneice、VdesmedT、Matt Gallagher、Johann):
可能な場合は、メディアをディスクに保存します。
TiledLayersでレンダリングする場合は、より大きなtileSizeを使用します
INIT頻繁プレースホルダオブジェクトと配列を用い、alternitively別の設計アプローチは、これ
画像は、
CGPDFPageRef
NSOperations
またはGCD&ブロックを使用して、事前にページを準備します。CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
前CGContextDrawPDFPage
に呼び出して、描画中のメモリ使用量を減らしますdocRefで初期化するの
NSOperations
は悪い考え(メモリ)であり、docRefをシングルトンにラップします。不要な
NSOperations
場合はキャンセルできます。特にメモリを使用する場合は、コンテキストを開いたままにしてください。ページオブジェクトをリサイクルし、未使用のビューを破棄する
開いているコンテキストが必要なくなったらすぐに閉じます
メモリ警告を受け取ったら、DocRefとページキャッシュを解放して再ロードします
その他のPDF機能:
PDF内のリンクの取得(およびこことここ)
リンクのターゲットを取得する(
/Dest
配列からページ番号を取得する)
検索(およびここ)(すべてのPDFで機能するわけではありません(変な文字が表示されるだけです。エンコードの問題だと思いますが、よくわかりません)-Credit BrainFeeder)
CALayerおよびオフスクリーンレンダリング -次のページをレンダリングして高速/スムーズな表示
ドキュメンテーション
- Quartz PDFObjects(メタ情報、注釈、サムに使用)
- Abobe PDF Spec
プロジェクトの例
- アップル/ ZoomingPDF -ズーム、
UIScrollView
、CATiledLayer
- VFR /リーダー -ズーム、ページング、
UIScrollView
、CATiledView
- 眉/葉 -素敵な遷移でページング
- /スキム -思われるすべて(OSXのPDFリーダー/エディター)
PSPDFKit
安価ではありませんが、価値があります。pspdfkit.com