ページ

2008年2月18日月曜日

NSTrackingArea

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

前回に引き続きマウスとラッキングの検証。

MacOSX10.5より NSTrackingArea が追加された。解説が ADCのドキュメントにある。

Using Tracking-Area Objects


早速サンプルを作ってみた。
NSTrackingAreaSample.zip


サンプルの動作は前回同様、ビューの領域にマウスカーソルが入ると色が変わるというもの。

さて以前のトラッキングとどう変わったかというと...
・トラッキングに関する情報が1つのクラスにまとめられた
・トラッキングオプションで受け取るイベントや振る舞いを設定することができるようになった
・トラッキング登録のメソッドが addTrackingRect:owner:userData:assumeInside: から addTrackingArea: に変更された。登録のタイミングが緩和され initWithFrame: でも良くなった。
・ビューの大きさが変更になると updateTrackingAreas が送られるようになった。これを使い、トラッキング領域の再設定ができる。

トラッキングオプションはリファレンスマニュアルに説明がある。
NSTrackingArea Class Reference

登録部分のコード例を示す。

- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
_mouse_status = 0;

_tracking_area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveInKeyWindow | NSTrackingEnabledDuringMouseDrag )
owner:self
userInfo:nil];
[self addTrackingArea:_tracking_area];
}
return self;
}


これだけで mouseEntered:, mouseMoved:, mouseExited が送られてくるようになる。これまでの方法と違って mouseEntered: と mouseExited: の中で setAcceptsMouseMovedEvents: を呼ぶ必要もなく、登録タイミングも initWithFrame: 内で良いのでわかりやすい。トラッキング情報を1つのクラスにまとめることでトラッキングに関する個所がシンプルになった。悪くない。

なおビューを NSScrollView の中で使う場合はオプションに NSTrackingInVisibleRect を指定すると表示領域のみがトラッキング対象となるので使いやすい。