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