2012-05-06 2 views
1

Comment puis-je déterminer si une fenêtre enfant a été déplacée directement par l'utilisateur plutôt que par le déplacement de sa fenêtre parent?Déterminer si la fenêtre enfant a été déplacée par l'utilisateur ou si la fenêtre parent a été déplacée?

Je reçois les notifications NSWindowDidMoveNotification dans les deux cas. J'ai pensé que je pourrais tester l'origine du cadre parent dans le gestionnaire NSWindowWillMoveNotification et le comparer à l'origine dans le gestionnaire NSWindowDidMoveNotification, mais y a-t-il peut-être un meilleur moyen?

Voici ma solution actuelle:

- (void)windowWillMove:(NSNotification *)notification 
{ 
    NSWindow *window = [notification object]; 
    _parentOrigin = [[window parentWindow] frame].origin; 
} 

- (void)windowDidMove:(NSNotification *)notification 
{ 
    NSWindow *window = [notification object]; 
    NSPoint newParentOrigin = [[window parentWindow] frame].origin; 
    if (_parentOrigin.x == newParentOrigin.x && 
     _parentOrigin.y == newParentOrigin.y) 
    { 
     // The parent hasn't moved, therefore the user moved the window directly... 
     [window doThing]; 
    } 
} 

Répondre

4

La fenêtre que vous cliquez sur pour déplacer deviendra la clé de la fenêtre, alors que la fenêtre enfant ne devient pas la clé si elle est déplacée à la suite de déplacer le parent fenêtre. Donc, si vous testez pour savoir si la fenêtre envoyant la notification est la fenêtre clé, vous pouvez dire qui a été déplacé par l'utilisateur.

- (void)windowDidMove:(NSNotification *)notification { 
    NSWindow *movedWindow = notification.object; 
    if ([movedWindow isKeyWindow]) { 
     NSLog(@"%@",movedWindow); 
     [movedWindow doThing]; 
    } 
} 
+0

C'est intéressant. Pouvez-vous expliquer pourquoi le statut «clé» est important ici? – trojanfoe

+0

Nevermind; Je pense que je comprends. Je vais essayer le matin et vous faire savoir comment je m'entends; Si cela fonctionne, c'est une meilleure solution qui nécessite une méthode ivar et une méthode déléguée de moins. – trojanfoe

+1

J'ai édité ma réponse pour être plus complète, donc la raison de tester isKey sera claire pour tout le monde. – rdelmar

Questions connexes