2011-01-09 3 views
9

私はMacプログラミングには新しく、カーソルがメインウィンドウに出入りするとイベントを発生させたい。私はNSTrackingAreaについて何かを読んだが、何をすべきか正確には分からない。NSTrackingAreaの使い方

答えて

13

アップルはNSTrackingAreasのドキュメントとサンプルを提供しています。

マウスがウィンドウに入ったときやウィンドウが存在するときを追跡する最も簡単な方法は、ウィンドウのcontentViewにトラッキングエリアを設定することです。

- (void) viewWillMoveToWindow:(NSWindow *)newWindow { 
    // Setup a new tracking area when the view is added to the window. 
    NSTrackingArea* trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil]; 
    [self addTrackingArea:trackingArea]; 
} 

- (void) mouseEntered:(NSEvent*)theEvent { 
    // Mouse entered tracking area. 
} 

- (void) mouseExited:(NSEvent*)theEvent { 
    // Mouse exited tracking area. 
} 

あなたはまた、NSViewののupdateTrackingAreasメソッドを実装し、確認するために、イベントのトラッキングエリアをテストする必要があります。しかし、これはちょうど簡単な例として、カスタムコンテンツビューのコードでは、ウィンドウのツールバー

を追跡しません。それは正しいものです。

+1

これは問題ではありませんが、コードはどこに置く必要がありますか?カスタムビューのコードはどこにありますか?アウトレットとアクションを使用するときと同じように、Interface Builderのビューにオブジェクトを接続する必要がありますか? – icant

+3

このコードはカスタムUIViewサブクラスに配置する必要があります。カスタムUIViewは、ウィンドウのコンテンツビューとして追加する必要があります。 Interface Builderを使用して、ウィンドウのコンテンツビューを作成または選択し、Interface Builderインスペクタパネルを使用してカスタムUIViewのクラスとしてそのクラスを指定します。 –

+0

ありがとう、それは動作します! – icant

5

回答者:Matt Bierner本当に助けてくれました。 -viewWillMoveToWindow:メソッドを実装する必要があります。

私はまた、あなたも、あなたがビューのサイズが変更されたときのトラッキングエリアを処理したい場合は、これを実装する必要がありますことを追加します。カスタムサブクラスで

- (void)updateTrackingAreas 
{ 
    // remove out-of-date tracking areas and add recomputed ones.. 
} 

を、ビューの変更ジオメトリを処理するために、これはあなたのために自動的に呼び出されます。

+15

ビューのサイズを変更した後にトラッキングエリアを再計算する必要がない場合は、** NSTrackingArea **を作成するときに** NSTrackingInVisibleRect **オプションを使用します。 – Mark

+2

@markあなたのコメントはこのページの中で最も重要なメモの1つです! – Kyle