出版プラットフォームとしてのiOS
PDFを高解像度でドローする機能
CGContextDrawPDFPageで関数、ともかくPDFは描画できるようになるが、ここで大きな問題が生じる。ズームなどをうまく処理したら、大きく拡大してみよう。CGContextDrawPDFPageでの描画結果は解像度はあまり高くなく、ちょっと拡大してもぼやけた画像しか見えない。特に、テキストがぼやけるのはいやがる人が多いだろう。
そこで、もっと解像度を高くできないかということになる。その手法は用意されているが、ここではCore Animation(以下CA)の仕組みが絡む。CAで定義されているレイヤーという機能があり、ビューはいくつかのレイヤーで構成されている。そこをうまく利用すれば、解像度の高いつまりは拡大してもぼやけないPDFの描画ができる。
ここからは、「Quartz 2D Programming Guide」ではなく「Scroll View Programming Guide for iOS」に移ろう。もちろん、CAのドキュメントは参照したいところだが、まずはPDF、という方は先にスクロールビューのドキュメントを見た方がいい。
また、サンプルプログラムの「ZoomingPDFViewer」も要チェックだ。こうしたPDF機能のカギになるようなことがなぜかスクロールのところに書かれている。とは言え、結局のところ拡大縮小やスムーズなページ移動などを組み込むことになるので、「Scroll View Programming Guide for iOS」はじっくりと全部読むことをお勧めする。
高解像度のPDF描画は、「Scroll View Programming Guide for iOS」の「Ensuring that Zoomed Content is Sharp when Zoomed」の部分や、サンプルプログラムの「ZoomingPDFViewer」を参照すれば記載がある。要は、drawRectによって描画をさせるのではなく、UIViewを継承したクラスで、drawLayer:inContext:というメソッドを用意して、そこでPDF描画をするのがキモだ。
こうすれば、確かに拡大してもぼやけないようになるが、描画が目に見えて遅くなる。タイル上に描かれる(ちなみに、FileMaker Goの初期バージョンではその様子がつぶさに見えていた)。サンプルプログラムの「ZoomingPDFViewer」では、それをうまくごまかすために、一度解像度の低いPDFページのピクチャを作ってまずはビューに配置し、それに重なるようにdrawLayer:inContext:で高精細度でPDF描画するビューを重ねると、描画に1、2秒かかるにしても、ユーザーにはそれが見えないようになるというわけだ。
図5:UIWebViewを利用したPDF表示。単に表示するだけなら、この方法は一番手軽で確実(クリックで拡大) | 図6:DrawRectをオーバーライドして描画した画面をズームしてみた。描画したときの解像度のまま変化しないので、拡大すると荒れた画像になる(クリックで拡大) | 図7:drawLayer:inContext:オーバーライドして描画すると、解像度に追随して拡大しても画像は荒れない(クリックで拡大) |
スムーズなスクロールをサポートする機能
描画の方法はここまで紹介した方法の通りだが、次のページに移動するなどの処理はここから作り込む必要がある。サンプルプログラムは、UIWebKitを使う方法以外は1ページ目しか表示していない。こうして1ページずつ表示をしようというわけだ。
結果的にページスクロールをあれこれ画策することになるが、それも「Scroll View Programming Guide for iOS」に書かれている。「Scrolling Using Paging Mode」というチャプターと、サンプルコードの「PageControl」をチェックしよう。あるページを表示しているときに、ドラッグすると次のページが見えながら次のページに移動するような仕組みは、ここに書かれていることが基本となる。
さて、PDFはこれがすべてではない。仕様書が500ページを超えるPDFのすべてがこれで表示できるわけではない。まず、注釈(アノテーション)については上記の方法では表示できない。自分でPDFの中身を解析して、必要な情報を取り出し、矢印やテキストを自分で描画する必要がある。PDFの解析方法は「Quartz 2D Programming Guide」の「PDF Document Parsing」にあるが、サンプルもなくそう簡単には行かない。地道な作業が待っている。
暗号化されているPDF、アタッチメント、リンクなどなど、PDFの機能は枚挙に暇がないほどたくさんある。iOSのCGによる描画はこれらの一部だけがサポートされている。プログラムの作成前に、どこまでのサポートが必要なのかをきっちりと定義してから始めることをお勧めしたい。OSのサポートでうまく行く範囲と、自分で解析する範囲を見極めて作業にかかろう。
4回にわたって、iPad、iPhoneを取り巻く環境から、iOSのバージョンの違い、ゲーム、出版それぞれのプラットフォームとしての評価などについて取り上げてきたが、いかがだっただろうか。iPhone、iPadのみならず、スマートフォンやタブレットの可能性は無限に広がっている。その発展をこれからも見守っていきたい。
- 編集部注:サンプルソースがダウンロードできない問題を修正しました。(2011/2/1)
「出版プラットフォームとしてのiOS」サンプルプログラム