2010-01-30 8 views
2

J'ai une série de vues imbriquées et j'ai besoin d'attraper l'événement mouseDown et faire la même chose quand l'une de ces vues est sélectionnée. Existe-t-il un moyen de dire à un superviseur de gérer des événements pour ses sous-vues? Est-ce la meilleure façon de gérer cela pour mettre une vue transparente sur toutes mes autres vues et avoir cette vue gérer les événements?Attraper les événements mouseDown des sous-vues. (Cocoa osx)

+0

La valeur par défaut 'mouseDown:' dans NSResponder transmet déjà l'événement au répondeur suivant. Quelles classes sont vos sous-vues? Pouvez-vous les modifier, ou sont les prédéfinis (contrôles de l'interface utilisateur, etc.)? –

+0

Mes sous-vues sont personnalisées NSViews. – Mike2012

Répondre

2

Vos vues secondaires définissent-elles leur propre mouseDown:?

Si elles ne définissent pas déjà leur propre -[… mouseDown:(id)event], elles doivent déjà transmettre leurs événements dans la chaîne du répondeur, ce qui devrait aboutir à votre vue d'ensemble. Sinon, (en plus de toutes les autres manipulations qu'ils doivent effectuer), ils doivent décider des événements que la vue supérieure doit également recevoir et appeler [super mouseDown:event] pour ces événements.

1

Dans la vue supérieure, vous pouvez remplacer hitTest pour renvoyer la vue supérieure si le point est dans le rectangle de la vue supérieure. Cela empêchera l'événement souris d'aller à l'une des sous-vues.

- (NSView *)hitTest:(NSPoint)aPoint 
{ 
    return NSPointInRect(aPoint, self.frame) ? self : nil; 
} 

Notez que aPoint se trouve dans le système de coordonnées "frame" de la vue supérieure, et non ses limites.

+0

Malheureusement, cela semble avoir cessé de fonctionner à partir de 10,8 – George

0

Cette version fonctionne pour convertir un point exprimé en coordonnées écran:

NSPointInRect([view convertPoint:[[view window] convertScreenToBase:point] fromView:nil], [view bounds]); 
Questions connexes