NSColorWellサブクラスがmouseMovedイベントを取得しない
-
10-07-2019 - |
質問
Cocoaアプリにカラーピッカーを実装しようとしています。 (はい、NSColorPanelについては知っています。あまり好きではありません。自分でロールバックすることのポイントは、私がもっとうまくやれると思うことです。)
これは、ピッカーの現在の状態の写真です。
(ソース: ryanballantyne.name )
カラーホイールを囲むウェルはNSColorWellサブクラスです。これらはプログラムでインスタンス化され、カラーホイールクラスでaddSubViewを呼び出すことにより、カラーホイールビュー(NSViewサブクラス)に追加されます。
グラブハンドルでカラーウェルをドラッグできるようにします。その旅の始まりは、マウスがハンドルの上にあるときにカーソルを開いた手に変えることです。悲しいことに、私は使用できません私のビューのほとんどが回転しているので、カーソルはこれを修正します。したがって、mouseMovedイベントを使用して、ヒット検出を自分で行う必要があります。
これは、私が機能させようとしているマウスイベントコードです。
- (void)mouseMoved:(NSEvent*)event
{
NSLog(@"I am over here!\n");
[super mouseMoved:event];
NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil];
BOOL isInHandle = [grabHandle containsPoint:eventPoint];
if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor]) {
[[NSCursor openHandCursor] push];
}
else if (!isInHandle) [NSCursor pop];
}
- (void)mouseEntered:(NSEvent*)event
{
[[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)mouseExited:(NSEvent*)event
{
[[self window] setAcceptsMouseMovedEvents:NO];
[NSCursor pop];
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
- (BOOL)resignFirstResponder
{
return YES;
}
mouseMovedメソッドが呼び出されないことがわかりました。出入りのための同上。ただし、mouseDownを実装すると、その1つが 呼び出されるため、必要なイベントだけでなく、少なくともいくつかのイベントが届きます。
アイデアはありますか?ありがとう!
解決
mouseEntered:およびmouseExited:ビューの開始/終了を直接追跡しません。ビューで設定した追跡エリアへの出入りを追跡します。関連するメソッドは、 -addTrackingRect:owner:userData:assumeInside:
および -removeTrackingRect:
です。ビュー全体を追跡する場合は、最初のパラメーターに [self bounds]
を渡すだけです。アプリが10.5+のみの場合は、追跡エリア内でのみマウス移動イベントの取得を直接サポートするため、代わりにNSTrackingAreaを使用する必要があります。
1)四角形の追跡は、カーソルが四角形を回転したビューと同じようにやや奇妙な動作をし、2)境界が変更された場合(フレームだけでなく)おそらく再確立する必要があることに注意してくださいトラッキング四角形を追加するため、トラッキング四角形のタグを保存して後で削除します。