ページ

2008年1月27日日曜日

NSCollectionView

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ADCにIconCollectionというサンプルが上がっていた。



10.5で追加されたNSCollectionViewを使いアイコンを表示するというもの。データの準備箇所を除くとコーディング量はかなり少なく、ほとんどがバインディングを使って InterfaceBuilderだけで組み立てられている。アイコンの並び順を替えるとアニメーションまでする。

面白かったので自分でも試してみる。IconCollectionでは NSViewControllerなどを使っているが、試すだけならもっとシンプルにできるはず。9枚のTIFF画像を用意してやってみた。

こんな感じ。


リサイズすると個々の画像がアニメーションして移動するのが見える。"SORT"ボタンで並び替えてもアニメーションが起る。これらは全部自動的に行われる。

NSCollectionView とバインディングが理解できれば簡単にコレクション表示ができる。これはいい。

コーディングは1つのクラスを実装しただけ。

MyController.h


@interface MyController : NSObject {

NSMutableArray *images;
BOOL sort_accending;

IBOutlet NSArrayController *array_controller;
}
- (IBAction)sort:(id)sender;
@end


MyController.m

@implementation MyController

-(id)init
{
if (self = [super init]) {
sort_accending = YES;
images = [[NSMutableArray alloc] init];
for (NSString* path in [[NSBundle mainBundle] pathsForResourcesOfType:@"tiff" inDirectory:nil]) {
NSImage *image = [[[NSImage alloc] initByReferencingFile:path] autorelease];
[images addObject:
[NSMutableDictionary dictionaryWithObjectsAndKeys:image, @"image", [path lastPathComponent], @"name", nil]];
}
}
return self;
}

- (IBAction)sort:(id)sender
{
NSSortDescriptor *sort = [[[NSSortDescriptor alloc]
initWithKey:@"name"
ascending:(sort_accending = !sort_accending)] autorelease];
[array_controller setSortDescriptors:[NSArray arrayWithObject:sort]];
}
@end


init 内の記述は実質データの用意だけ。表示に関してはすべて InterfaceBuilderだけで済む。

その分 InterfaceBuilderの方は少し複雑になる。慣れればどうってことないのだが。




ツールパレットから NScollectionViewをドラッグ&ドロップすると NSCollectionViewItem と NSViewが一緒に作られる。関係は次のような感じ。



右側のView Itemがコレクションの要素1個分に当たり、ここで表示内容を決めてやる。NSCollecionViewItemは、これとNSCollectionViewとの間に入り、コントローラのような役割を果たす。図のように適切にアウトレットとバインディングを設定すると動き出す。分かってしまうと実に簡単。コーディングなしでここまでできるとは楽だ。


サンプル
study01.zip