Question

J'essaie d'implémenter un sélecteur de couleur dans mon application Cocoa. (Oui, je connais NSColorPanel. Je ne l’aime pas beaucoup. Mon objectif principal est de penser que je peux faire mieux.)

Voici une photo de l'état actuel de mon sélecteur.

 Aperçu personnalisé!
(source: ryanballantyne.name )

Les puits entourant la roue chromatique sont des sous-classes NSColorWell. Ils sont instanciés par programme et ajoutés à la vue Roue de couleurs (une sous-classe NSView) en appelant addSubView sur la classe de roues de couleur.

Je veux faire en sorte que vous puissiez faire glisser les puits de couleur autour de leurs poignées. Le début de ce voyage fait en sorte que le curseur devienne une main ouverte lorsque la souris survole les poignées. Malheureusement, je ne peux pas utiliser de le curseur est juste parce que la plupart de mes vues sont pivotées . Je dois donc utiliser les événements mouseMoved et effectuer moi-même la détection des hits.

Voici le code d'événement de souris que j'essaie de faire fonctionner:

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

Je constate que ma méthode mouseMoved n'est jamais appelée. Idem pour entrer et sortir. Cependant, lorsque j'implémente mouseDown, celui-ci est appelé, de sorte qu'au moins certains événements me parviennent, mais pas ceux que je souhaite.

Des idées? Merci!

Était-ce utile?

La solution

mouseEntered: et mouseExited: ne trace pas directement l'entrée / la sortie de votre vue; ils surveillent les zones de suivi que vous avez définies à votre avis. Les méthodes appropriées sont -addTrackingRect: propriétaire: userData: assumInside: et -removeTrackingRect: . Passez simplement [limites propres] pour le premier paramètre si vous souhaitez que votre vue entière soit suivie. Si votre application concerne uniquement la version 10.5+, vous devriez probablement utiliser plutôt NSTrackingArea, car elle prend directement en charge l’obtention d’événements déplacés par la souris uniquement dans la zone de suivi.

Gardez à l'esprit que 1) les objets suivis ont le même comportement quelque peu étrange que les objets rapportés par le curseur avec des vues pivotées, et 2) si vos limites changent (pas simplement votre cadre), vous devrez probablement rétablir le contact. votre suivi de suivi, alors enregistrez la balise du suivi pour le supprimer ultérieurement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top