PDFをアイコンに使う

English version is ready: 英語

どうも、吉村です

通常はアイコン等ほとんど画像リソースで済ませることが多いかと思います。
しかしながら、ラスター画像は拡大縮小に自由度が少ないという致命的な欠点があります。ラスター画像であるが故に、Retinaとそうでないものを分けて用意しなければならないですし、ちょっとした拡大にも無駄な手間がかかってしまいます。
そこでじゃあベクター画像はどうか?というのが今回の趣旨です。

ベクター画像として最初に浮かんだのがSVGですが、これはiOSでは結構面倒で、WebViewで表示は可能なのですが致命的に速度が出ません。またオープンソースのSVGラスタ化のプロジェクトも今ひとつパッとしません。
そこで次にうかんだPDFですが、これは結構充実したAPIが存在するようで、今回はこのPDFをアイコン画像に使うことを考えます。

UIImageの拡張としてこういうのはどうでしょうか?

このように準備しておけば、PDFを読み、必要なタイミングで必要な解像度の画像が手に入ります。
そしてRetina等は自動的に選ばれる(UIGraphicsBeginImageContextWithOptions)ため、Retina版とそうでないのを分けて用意する必要もなく、事前にサイズを決定しておく必要すらないです。

※ width、heightが一つしかないのは、片方が決まればもう片方が決まるためです
※ 背景透過も問題なくうまくいきます(テストではPDF出力にiDrawを使っています)

難点としては速度でしょうか、画像を読み込むのに比べて多少はオーバーヘッドがあるので、
リソースが多すぎると多少パフォーマンスが犠牲になるケースがあるかもしれません。