Je travaille sur une petite application de téléchargement d'image Menubar pour OS X. J'ai créé la sous-classe Voici à quoi il ressemble par défaut: < / p> Les événements de la souris sont géré par le Cela fonctionne bien jusqu'à ce que je déplace mon curseur rapidement sur les objets. Il semble que l'événement J'ai également essayé de déplacer la manipulation de la souris dans le nsview code> Nsview pour les éléments téléchargés.
nsviewController code> de la manière suivante: p> < Pré> XXX PRE>
Mouseexited () code> n'est pas appelé, et la vue reste avec un fond bleu (la souris est en fait sur le bouton Quit): p>
Nsview code>, mais avec les mêmes résultats. J'apprécie toute entrée! Merci! P> p>
3 Réponses :
À mon avis, Apple a eu des bugs dans cette zone.
Assumant que vous mettez à jour votre zone de suivi selon Apple Docs, L'ajout de cette solution supplémentaire pourrait résoudre votre problème ... cela me le résout dans de nombreux cas. Je vérifie dans la routine Mousemoved / MouseNered que le curseur de la souris est toujours dans ma trame de vues et, sinon, appelez Mouseexited: moi-même. P>
- (void) adjustTrackingArea { if ( trackingArea ) { [self removeTrackingArea:trackingArea]; [trackingArea release]; } // determine the tracking options NSTrackingAreaOptions trackingOptions = // NSTrackingEnabledDuringMouseDrag | // don't track during drag NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | //NSTrackingActiveInActiveApp | NSTrackingActiveInKeyWindow | NSTrackingActiveWhenFirstResponder | NSTrackingActiveAlways; NSRect theRect = [self visibleRect]; trackingArea = [[NSTrackingArea alloc] initWithRect: theRect options: trackingOptions owner: self userInfo: nil]; [self addTrackingArea:trackingArea]; } - (void)resetCursorRects { [self adjustTrackingArea]; } - (void)mouseEntered:(NSEvent *)ev { [self setNeedsDisplay:YES]; // make sure current mouse cursor location remains under the mouse cursor NSPoint cursorPt = [self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:NULL]; // apple bug!!! //NSPoint cursorPt2 = [self convertPointFromBase:[ev locationInWindow]]; //if ( cursorPt.x != cursorPt2.x ) // NSLog( @"hello old cursorPt" ); NSRect r = [self frame]; if ( cursorPt.x > NSMaxX( r ) || cursorPt.x < 0 ) { [self mouseExited:ev]; //cursorPt.x = [self convertPointFromBase:[ev locationInWindow]]; //if ( cursorPt.x > NSMaxX( r ) || cursorPt.x < r.origin.x ) return; } ... your custom stuff here ... } - (void)mouseExited:(NSEvent *)theEvent { if ( isTrackingCursor == NO ) return; [[NSCursor arrowCursor] set]; isTrackingCursor = NO; [self setNeedsDisplay:YES]; } - (void)mouseMoved:(NSEvent *)theEvent { [self mouseEntered:theEvent]; }
J'ai pu proposer une solution basée sur cette réponse. Merci Keith!
Je ne comprends pas si vous installez une Nstrackingarea pour toute la fenêtre (dans ce cas de menu) ou pour chaque élément. Si vous faites ce dernier, ne le faites pas, sinon vous passerez un moment sans fin pour corriger les problèmes que vous voyez. La façon dont j'ai géré ce comportement de buggy est de créer une Nstrackingarea pour la fenêtre entière et je me rends compte où la souris est et gère la mise en surbrillance de chaque article moi-même. Je sais que ce n'est pas idéal, mais c'était la seule façon de la résoudre après avoir frappé moi-même dans la tête pendant trois jours. P>
C'est une bonne réponse ... J'utilise une méthode similaire pour implémenter un système d'info-bulle de type navigateur au bas de ma fenêtre. (Les utilisateurs de puissance n'aiment pas les info-bulles de style contextuel sur des guistiques qu'ils utilisent souvent)
Vous pouvez suivre ce qui était l'ancienne menuit active et le gérez-le en conséquence, quelque chose comme: Ainsi, vous vous assurerez qu'au plus un sera actif. P> p>
Merci pour la réponse! C'est une bonne solution pour déplacer le curseur sur les éléments, mais si je déplace la souris à l'extérieur de la fenêtre sans faire d'autre chose (ou un nsmenuitem natif), le problème reste. : /
Cela semble très similaire à d'autres problèmes de performances OSX lentes où permettant d'améliorer l'animation de base améliore la performance. Jetez un coup d'œil à