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:
ConfiguregestureRecognizer
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;
}