uipickerview uitapgesturerecognizer ios7.1

iOS 7.1 UITapGesture no funciona con UIPickerView



uitapgesturerecognizer ios7.1 (5)

Estamos utilizando un UIPickerView para permitir que un usuario seleccione de una lista de opciones. Estamos agregando UIPickerView como una subvista de un contenedor UIView. Estamos agregando un UITAPGestureRecognizer al contenedor UIView . El UITapGestureRecognizer se usa para descartar el selector al eliminar su UITapGestureRecognizer .

En iOS 7.0 y versiones anteriores, esto funcionaba como se esperaba. Sin embargo, en iOS 7.1, esta configuración ya no funciona en el sentido de que UITapGestureRecognizer no reconoce el toque y llama al selector especificado en la acción (descartando la vista del selector y la vista del contenedor). el código está debajo

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.nameList=[[NSMutableArray alloc] initWithObjects:@"A",@"B",@"C", nil]; UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)]; myPickerView.delegate = self; myPickerView.showsSelectionIndicator = YES; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapInListPickerView:)]; [singleTap setNumberOfTapsRequired:1]; [singleTap setNumberOfTouchesRequired:1]; [myPickerView addGestureRecognizer:singleTap]; [self.view addSubview:myPickerView]; } -(void)tapInListPickerView:(UIGestureRecognizer *)sender { NSLog(@"Taped in pikcer view"); }

Si se necesita alguna otra información o si hay un método más preferido para hacerlo, házmelo saber.


La respuesta aceptada es muy útil, ¡gracias! Ya estaba subclasificando UIPickerView. Entonces, siguiendo ZDidier, hice la subclase UIGestureRecognizerDelegate y luego addGestureRecognizer esta manera:

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { gestureRecognizer.delegate = self; [super addGestureRecognizer:gestureRecognizer]; }

Eso lo solucionó para mí.


Logré casi restaurar la funcionalidad original subclasificando UIPickerView y reemplazando la implementación de hitTest. La nueva implementación primero permite que todas las filas del selector reclamen el evento táctil antes de que finalmente permita que el propio selector lo reclame.

Digo casi porque hay otro cambio en el UIPickerView donde las vistas que son visibles en el selector ya no existen. Entonces, el usuario toca una imagen visible de una fila que no está centrada en el selector y puede hacer que el selector se desplace en lugar de seleccionar esa fila porque ya no existe.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (self.hidden) { return nil; } else { if (event.type == UIEventTypeTouches) { for (int component = 0; component < self.numberOfComponents; component++) { for (int row = 0; row < [self numberOfRowsInComponent:component]; row++) { UIView *view = [self viewForRow:row forComponent:0]; if (view) { view = [view hitTest:[self convertPoint:point toView:view] withEvent:event]; if (view) { return view; } } } } } return [super hitTest:point withEvent:event]; } }


Método Swift para los perezosos:

cumplir con el protocolo UIGestureRecognizerDelegate

y

override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }


Tuve el mismo problema, y ​​finalmente tuve una revelación: P

Era como que los rencognizers de gestos simultáneos en uiPickerView no funcionan.

así que uso el gesto delegado

< UIGestureRecognizerDelegate>

con

// add tap gesture UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)]; [picker addGestureRecognizer:gestureRecognizer]; gestureRecognizer.delegate = self;

con

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ // return return true; }

y luego está funcionando!

Nos vemos


Prueba este sol:

Configure gestureRecognizer como verdadero para detectar en todas las versiones de ios

Paso 1: agrega UIGestureRecognizerDelegate

Paso 2: agrega el código de folloeing a tu archivo de clase

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // return return true; }