Question

Je travaille sur une vue glisser-déposer et j'ai trouvé des gestionnaires pour les actions glisser-déposer sur le Web.Je veux faire en sorte qu'il devienne bleu lorsque l'utilisateur fait glisser un fichier sur la zone de glisser-déposer et à nouveau gris lorsqu'il quitte la zone de glisser-déposer.Le problème est qu'il ne se met pas à jour lorsque vous faites glisser votre souris dessus ou que vous le quittez.Voici une partie du code :

- (void)drawRect:(NSRect)rect
{
   NSRect bounds = [self bounds];
   [[NSColor grayColor] set];
   [NSBezierPath fillRect:bounds];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender  {
    NSRect bounds = [self bounds];
    [[NSColor blueColor] set];
    [NSBezierPath fillRect:bounds];

    return NSDragOperationCopy;

}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    NSRect bounds = [self bounds];
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:bounds];

}

Merci pour toute aide.

Était-ce utile?

La solution

Le dessin ne fonctionne que lorsqu'un contexte (comme une toile pour peindre) est configuré dans lequel vous pouvez dessiner.Quand le cadre appelle -drawRect: il a configuré un contexte de dessin pour vous, donc des commandes de dessin comme -[NSColor set] et -[NSBezierPath fillRect:] travaillez comme vous le souhaitez.

En dehors de -drawRect: il n'y a généralement aucun contexte de dessin configuré.Utilisation de commandes de dessin en dehors de -drawRect: c'est comme agiter un pinceau en l'air ;il n'y a pas de toile, donc aucune peinture n'a lieu.

Dans 99,99 % des cas, tous les dessins de vue doivent être conservés dans les limites -drawRect: car NSView fait beaucoup de travail que vous ne voulez pas faire pour configurer correctement et efficacement le contexte de dessin.

Alors, comment modifier le dessin de votre vue dans votre -draggingEntered: et -draggingExited: méthodes ?Par effets secondaires.

Vous faites la même chose dans les trois cas :1) Définir une couleur et 2) Dessiner un rectangle.La seule différence réside dans les changements de couleur dans chaque méthode.Alors pourquoi ne pas contrôler la couleur que vous utilisez -drawRect: avec un ivar, comme ceci :

- (void)draggingEntered:(id <NSDraggingInfo>)sender {
    drawBlueColorIvar = YES;
    // ...
}

Puis dans -drawRect: Tu fais cela:

- (void)drawRect:(NSRect)rect {
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor];
    [color set];
    [NSBezierPath fillRect:rect];
}

(Remarquez que je n'ai pas utilisé [self bounds].Il est plus efficace de simplement dessiner dans le rectangle « sale », lorsque cela est possible.)

Enfin, vous avez besoin d'un moyen d'indiquer au framework que votre vue doit être redessinée lorsque drawBlueColorIvar change.Le framework ne dessinera rien à moins qu'on lui dise que c'est nécessaire.Comme Chris Cooper l'a dit, vous faites cela avec [self setNeedsDisplay:YES].Cela devrait aller après n'importe quel endroit où vous changez drawBlueColorIvar.

Autres conseils

Est-ce que tu appelles [yourView: setNeedsDisplay] n'importe où?

C'est ainsi que vous faites savoir au framework de dessin qu'il doit envoyer un message à votre UIView sous-classe avec drawRect:, vous devriez donc le faire chaque fois que les choses ont changé.Dans votre cas, cela signifie probablement lorsque la souris entre ou sort de la zone de dépôt.

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