2010-05-07 10 views
56

¿Cómo puedo saber en cuál de las vistas hijo se produjo un evento al usar UIGestureRecognizers?Buscar qué vista secundaria se tocó al usar UITapGestureRecognizer

De acuerdo con la documentación:

Un reconocedor gesto opera en toques-probados golpear a una vista específica y todos subvistas de ese punto de vista.

Por lo que yo puedo ver, la propiedad 'vista' es

La vista del reconocedor gesto es unido a.

que será la vista principal.

Respuesta

162

Esto encontrará la vista descendente más interna en la ubicación del evento. (Tenga en cuenta que si ese punto de vista niño tiene nietos privadas internas interactivas este código va a encontrar los mismos.)

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

En Swift 2:

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

En 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

Excelente! Muchas gracias, ¡eso realmente me ayudó! – RPM

+0

¡Impresionante! Esto ayudará con mucho más que solo este caso :) – RileyE

+10

Solo quería agregar que 'hitTest: withEvent:' irá tan lejos como pueda del árbol de los niños. Si hay algunas subvistas, o subvistas de subvistas, que desea ignorar, puede establecer 'userInteractionEnabled = NO' en esas vistas. – robotspacer

-1

Para usuarios futuros ... Ahora tengo una mejor opción cuando el mundo ya no usa obj-c ...

[sender view]

uso de esta manera:

UITapGestureRecognizer * objTapGesture = [self createTapGestureOnView:myTextField]; 

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

// añadir estos métodos

-(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 de UIGestureRecognizer] devuelve una vista a la que está adjunta (por especificación); OP está interesado en la subvista de esa vista. –

Cuestiones relacionadas