2010-05-07 5 views
56

Comment puis-je savoir sur lequel des enfants a vu un événement se produire lors de l'utilisation de UIGestureRecognizers?Recherche de la vue enfant qui a été sélectionnée lors de l'utilisation de UITapGestureRecognizer

Selon la documentation:

Un geste de reconnaissance fonctionne sur touche testé a frappé à une vue spécifique et l'ensemble des sous-vues de ce point de vue.

Pour autant que je peux voir, la « vue » est la propriété

La vue le geste est attaché de reconnaissance à.

qui sera la vue parent.

Répondre

162

Vous trouverez la vue descendante la plus interne à l'emplacement de l'événement. (Notez que si ce point de vue de l'enfant a des petits-enfants privés internes interactifs ce code trouvera ceux aussi.)

UIView* view = gestureRecognizer.view; 
CGPoint loc = [gestureRecognizer locationInView:view]; 
UIView* subview = [view hitTest:loc withEvent:nil]; 

Swift 2:

let view = gestureRecognizer.view 
let loc = gestureRecognizer.locationInView(view) 
let subview = view?.hitTest(loc, withEvent: nil) // note: it is a `UIView?` 

Swift 3:

let view = gestureRecognizer.view 
let loc = gestureRecognizer.location(in: view) 
let subview = view?.hitTest(loc, with: nil) // note: it is a `UIView?` 
+0

Excellent! Merci beaucoup - cela m'a vraiment aidé! – RPM

+0

Génial! Cela va aider avec beaucoup plus que juste ce cas :) – RileyE

+10

Je voulais juste ajouter que 'hitTest: withEvent:' ira aussi loin que possible dans l'arbre des enfants. S'il existe des sous-vues ou des sous-vues de sous-vues que vous souhaitez ignorer, vous pouvez définir 'userInteractionEnabled = NO' sur ces vues. – robotspacer

-1

Pour les futurs utilisateurs ... J'ai maintenant une meilleure option quand le monde n'utilise plus obj-c ...

[sender view]

utiliser cette façon:

UITapGestureRecognizer * objTapGesture = [self createTapGestureOnView:myTextField]; 

[objTapGesture addTarget:self action:@selector(displayPickerView:)]; 

// ajouter ces méthodes

-(void)displayPickerView:(UITapGestureRecognizer*)sender 
{ 
    UITextField *textField = (UITextField*)[sender view]; 
    NSLog(@"tag= %ld", (long)textField.tag); 
} 

-(UITapGestureRecognizer*)createTapGestureOnView:(UIView *)view 
{ 
    view.userInteractionEnabled = YES; 
    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]init]; 
    tapGesture.numberOfTapsRequired = 1; 
    tapGesture.numberOfTouchesRequired = 1; 
    [view addGestureRecognizer:tapGesture]; 
    return tapGesture; 
} 
+0

- [vue UIGestureRecognizer] renvoie une vue à laquelle elle est attachée (par spécification); OP s'intéresse à la sous-vue de cette vue. –

Questions connexes