1

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を実装すると、そのイベント呼び出されるため、必要なイベントだけでなく、少なくともいくつかのイベントが私に届きます。

何か案は?ありがとう!

4

1 に答える 1

2

mouseEntered:およびmouseExited:ビューの出入りを直接追跡しないでください。ビューで設定した追跡領域への出入りを追跡します。関連するメソッドはと-addTrackingRect:owner:userData:assumeInside:です-removeTrackingRect:[self bounds]ビュー全体を追跡する場合は、最初のパラメーターを渡すだけです。アプリが10.5以降のみの場合は、追跡領域内でのみマウス移動イベントの取得を直接サポートするため、代わりにNSTrackingAreaを使用する必要があります。

1)トラッキングレクは、ビューを回転させたカーソルレクと同じやや奇妙な動作をします。2)境界が(フレームだけでなく)変更された場合は、トラッキングレクを再確立する必要があります。 、後でそれを削除するために追跡rectのタグを保存します。

于 2009-08-02T13:30:21.343 に答える