画像のブラウズ表示は、Image Kitの目玉機能だ。iPhotoのように、サムネイルを使って複数の画像をブラウズすることができる。
この機能の紹介をしよう。
IKImageBrowserViewクラス
ブラウズ表示を担当するのは、IKImageBrowserViewというクラスだ。このクラスは、IKImageViewと同様に、Interface Builderを使ってインスタンス化出来る。
使うときの注意点も、IKImageViewと同じだ。即ち、スクロールビューの中に入れてやる必要がある。先ほどと同じ手順を使い、スクロールビューを追加しよう。その際、縦方向のスクロールバーだけ表示するように設定してやるのがコツだ。
IKImageBrowserViewは、NSTableViewなどと同じように、データソースとデリゲートを使う。これらの設定も、Inteface Builderで行っておこう。
データソースと画像オブジェクト
さて、データソースである。データソースのメソッドは、IKImageBrowserDataSourceというプロトコルで定義されている。必ず実装する必要のあるメソッドの数は、2つになる。
それらの必須メソッドを紹介しよう。1つは、ブラウズする画像の数を返すnumberOfItemsInImageBrowser:。もう1つは、表示する画像オブジェクトを返すimageBrowser:itemAtIndex:である。
IKImageBrowserView.h
- (NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView*)browser;
- (id)imageBrowser:(IKImageBrowserView*)browser itemAtIndex:(NSUInteger)index;
1つめのメソッドは、特に説明する必要はないと思う。問題は、2つめだ。指定されたインデックスに対応する画像オブジェクトを返すのだが、そもそも画像オブジェクトとはなんであろう?
実は、ブラウズ表示を行うには、それ用のクラスを新たに作らなくてはいけないのである。そのクラスは、IKImageBrowserItemプロトコルに準拠している必要がある。
プロトコルの説明の前に、なぜ新しいクラスを作るのか、その必要性を考えてみよう。データソースでは画像を指定するのだが、これにはかなり慎重な処理を求められることが予想される。なぜなら、一般に画像は非常に大きいデータを必要とするからだ。これを無頓着に作っていくのでは、メモリの浪費になってしまう。または、様々なフォーマットの画像を表示することもあるだろう。つまり、画像のためのデータソースは、通常のものよりも柔軟な処理を求められるのである。
そこで登場するのが、IKImageBrowserItemプロトコルというわけだ。このプロトコロルでは、次の3つのメソッドが必須項目となっている。
IKImageBrowserView.h
- (NSString*)imageUID;
- (NSString*)imageRepresentationType;
- (id)imageRepresentation;
imageUIDは、オブジェクトのIDになる。imageRepresentationTypeは、このオブジェクトが持つ画像のタイプ。imageRepresentationは、そのタイプに基づいた、実際の画像、ということになる。
となれば肝心なのは、画像のタイプとしてどのようなものが利用出来るか、ということだろう。以下のようなものが用意されている。
- 画像のパス
- 画像のURL
- NSImage
- CGImage
- CGImageSource
- NSData
- NSBitmapImageRep
- QTMovie
- ムービーのパス
- QComposition
- Quartz Composerコンポジションのパス
- パスを指定してQuickLookを使う
- IconRef
- アイコンのパス
これだけのものが用意されている。Core Graphicsで表示出来る画像だけでなく、QuickTimeやQuartz Composerにも対応している訳だ。