7
votes

NsviewController lente pour enregistrer les événements de la souris?

Je travaille sur une petite application de téléchargement d'image Menubar pour OS X. J'ai créé la sous-classe nsview Nsview pour les éléments téléchargés.

Voici à quoi il ressemble par défaut: < / p>

 ravioli - non plané

Les événements de la souris sont géré par le nsviewController de la manière suivante: < Pré> XXX

Cela fonctionne bien jusqu'à ce que je déplace mon curseur rapidement sur les objets. Il semble que l'événement Mouseexited () n'est pas appelé, et la vue reste avec un fond bleu (la souris est en fait sur le bouton Quit):

 Bug Ravioli

J'ai également essayé de déplacer la manipulation de la souris dans le Nsview , mais avec les mêmes résultats. J'apprécie toute entrée! Merci!


1 commentaires

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 à


3 Réponses :


2
votes

À 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];
}


1 commentaires

J'ai pu proposer une solution basée sur cette réponse. Merci Keith!



1
votes

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.


1 commentaires

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)



0
votes

Vous pouvez suivre ce qui était l'ancienne menuit active et le gérez-le en conséquence, quelque chose comme: xxx

Ainsi, vous vous assurerez qu'au plus un sera actif.


1 commentaires

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. : /