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)
Répondre
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.
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.
Malheureusement, cela semble avoir cessé de fonctionner à partir de 10,8 – George
Cette version fonctionne pour convertir un point exprimé en coordonnées écran:
NSPointInRect([view convertPoint:[[view window] convertScreenToBase:point] fromView:nil], [view bounds]);
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.)? –
Mes sous-vues sont personnalisées NSViews. – Mike2012