Frage

Ich versuche, eine Farbauswahl in meiner Cocoa-Anwendung zu implementieren. (Ja, ich weiß über NSColorPanel. Ich mag es nicht sehr viel. Der Punkt meiner eigenen rollen ist, dass ich glaube, ich kann es besser machen.)

Hier ist ein Bild von dem aktuellen Stand meines Picker.


(Quelle: ryanballantyne.name )

Die Wells das Farbrad umgeben, sind NSColorWell Subklassen. Sie werden instanziiert programmatisch und die Farbrad Ansicht hinzugefügt (eine NSView Unterklasse) durch den Aufruf addSubView auf der Farbrad Klasse.

Ich will es machen, so dass Sie die Farb Brunnen um durch ihre Haltegriffe ziehen. Der Beginn dieser Reise macht die Cursor Änderung eine offene Hand, wenn die Maus über die Griffe schwebt. Leider href="https://stackoverflow.com/questions/1211277/why-shouldnt-i-use-a-cursor-rect-on-a-rotated-nsview-subclass"> sind. Ich muss daher mousemoved Ereignisse verwenden und die Treffererkennung selbst tun.

Hier ist der Maus-Ereignis Code Ich versuche, Arbeit zu machen:

- (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;
}

Ich finde, dass meine Methode mousemoved nie aufgerufen. Das Gleiche gilt für betreten und verlassen. Allerdings, wenn ich mouseDown- implementieren, dass ein hat erhalten genannt, so dass zumindest einige Ereignisse sind mir immer, nur nicht die, die ich will.

Irgendwelche Ideen? Dank!

War es hilfreich?

Lösung

mouseEntered: und mouseExited: erfasse nicht die Eingabe / Verlassen Ihrer Ansicht direkt; sie spur Eingabe / Verlassen alle Tracking-Bereiche, die Sie in Ihrer Ansicht festgelegt haben. Die entsprechenden Methoden sind -addTrackingRect:owner:userData:assumeInside: und -removeTrackingRect:. Nur [self bounds] für den ersten Parameter übergeben, wenn Sie Ihre ganze Sicht verfolgt werden soll. Wenn Ihre App 10.5+ nur ist, sollten Sie wahrscheinlich verwenden NSTrackingArea statt, da es direkt unterstützt immer Maus-verschobene Ereignisse nur innerhalb des Tracking-Bereich.

Beachten Sie, dass 1) Tracking Rects das gleiche etwas merkwürdige Verhalten als Cursor Rects w / r / t Ansichten gedreht wird, und 2) wenn Sie Ihre Grenzen ändern (und nicht nur der Rahmen) Sie werden wahrscheinlich brauchen, um wieder herzustellen Ihr Tracking-rect, so dass der Tracking-rect des Tags speichern und später zu entfernen.

scroll top