Domanda

Sto cercando di implementare un selettore di colori nella mia app Cocoa. (Sì, lo so di NSColorPanel. Non mi piace molto. Il punto di fare il mio è che penso di poter fare di meglio.)

Ecco una foto dello stato attuale del mio selettore.

 Visualizzazione personalizzata!
(fonte: ryanballantyne.name )

I pozzetti che circondano la ruota dei colori sono sottoclassi di NSColorWell. Vengono istanziati a livello di codice e aggiunti alla vista della ruota dei colori (una sottoclasse NSView) chiamando addSubView sulla classe della ruota dei colori.

Voglio farlo in modo da poter trascinare i pozzetti di colore attorno alle maniglie di presa. L'inizio di quel viaggio sta trasformando il cursore in una mano aperta quando il mouse passa sopra le maniglie. Purtroppo, Non riesco a utilizzare un cursore corretto per questo perché la maggior parte delle mie visualizzazioni sono ruotate . Devo quindi utilizzare gli eventi mouseMoved ed eseguire personalmente il rilevamento dei colpi.

Ecco il codice evento del mouse che sto cercando di far funzionare:

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

Trovo che il mio metodo mouseMoved non venga mai chiamato. Idem per entrare e uscire. Tuttavia, quando implemento mouseDown, quel viene chiamato, quindi almeno alcuni eventi mi stanno arrivando, ma non quelli che voglio.

Qualche idea? Grazie!

È stato utile?

Soluzione

mouseEntered: and mouseExited: non tracciare l'accesso / uscita direttamente dalla vista; tengono traccia dell'entrata / uscita da qualsiasi area di tracciamento stabilita nella tua vista. I metodi pertinenti sono -addTrackingRect: owner: userData: assumeInside: e -removeTrackingRect: . Basta passare [self bounds] per il primo parametro se si desidera monitorare l'intera vista. Se la tua app è solo 10.5+, probabilmente dovresti usare NSTrackingArea invece poiché supporta direttamente il recupero di eventi mossi dal mouse solo all'interno dell'area di tracciamento.

Tieni presente che 1) il rilevamento dei rects ha lo stesso comportamento un po 'strano dei cursori rect con viste ruotate, e 2) se i tuoi limiti cambiano (non solo il tuo frame) probabilmente dovrai ristabilire il tuo rettangolo di monitoraggio, quindi salva il tag del rettangolo di monitoraggio per rimuoverlo in seguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top