2010-05-07 11 views
56

Come sapere su quale vista del bambino si è verificato un evento durante l'utilizzo di UIGestureRecognizers?Trova quale vista secondaria è stata toccata quando si utilizza UITapGestureRecognizer

Secondo la documentazione:

un sistema di riconoscimento gesto opera su tocchi hit-testate per una vista specifica e tutti subviews di quella vista.

Per quanto posso vedere, la proprietà 'vista' è

La vista riconoscitore gesto è attaccato.

che sarà la vista principale.

risposta

162

Questo troverà la vista discendente più interna nella posizione dell'evento. (Si noti che se questo punto di vista bambino ha qualche nipoti privati ​​interni interattive questo codice troverà anche quelle.)

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

In Swift 2:

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

In 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

Eccellente! Grazie mille - mi ha davvero aiutato! – RPM

+0

Fantastico! Questo aiuterà molto di più di questo caso :) – RileyE

+10

Volevo solo aggiungere che 'hitTest: withEvent:' sarà il più lontano possibile dall'albero dei bambini. Se ci sono sottoview o sottoview delle sottoview, che si vogliono ignorare, è possibile impostare 'userInteractionEnabled = NO' su quelle viste. – robotspacer

-1

Per gli utenti futuri ... Ora ho un'opzione migliore quando il mondo non usa più obj-c ...

[sender view]

uso in questo modo:

UITapGestureRecognizer * objTapGesture = [self createTapGestureOnView:myTextField]; 

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

// aggiungere questi metodi

-(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

- [Vista UIGestureRecognizer] restituisce una vista a cui è collegato (per specifica); OP è interessato alla sottoview di quella vista. –

Problemi correlati