2012-09-20 19 views
14

Aparentemente iOS 6 intenta manejar automáticamente la situación cuando tienes un reconocedor de gestos y un UIButton en el mismo lugar, activándolos para el mismo gesto.Manejo de reconocedores de gestos en iOS6

Esta nueva manipulación automática resuelve el problema cuando se desea hacer clic en el botón en lugar de activar el reconocedor gesto, pero crea un nuevo problema cuando desee que el reconocedor gesto de actuar.

En iOS 5 podría implementar:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

para transferir la acción a la UIButton cuando en un conflicto.

Esto no parece funcionar en iOS 6. Además, invertir el comportamiento de este método (porque ahora el UIButton tiene prioridad en lugar del reconocedor de gestos) no funcionará.


método completo:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isKindOfClass:[UIControl class]]){ 
     return NO; 
    } 
    return YES; 
} 
+0

tienes uigesturerec ¿Tiene un visor en una vista que tiene una subvista de uibutón y quiere que el reconocedor de gestos obtenga toques en lugar del botón? – Ahti

+0

sí. En realidad es un 'UITableView' con' UIButtons' dentro de las celdas, y quiero que el reconocedor de gestos se active en lugar de los botones. – jturolla

+0

¿No ha hecho esto iOS desde su origen? Siempre he tenido problemas al presionar un botón. –

Respuesta

6

He hecho esto para solucionar el problema, cambie como mejor le parezca: objetivo

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     [self MyCommonSelector];// this will work for ios 5 
     return Yes; 
} 

Agregar en el botón donde se declara por lo que este le llamará en IOS 6:

[self.myButton addTarget:self action:@selector(MyCommonSelector) 
    forControlEvents:UIControlEventTouchUpInside]; 

Haz tus cosas en este método que también se llamará al tocar el botón y desde el gesto que necesitas llamar:

-(void)MyCommonSelector 
{ 
    //Do your stuff here what you want to do with Gesture too. 
} 
0

A pesar de que no sé por qué se puso UIButtons allí si usted no quiere que ser aprovechado, puede evitar subvistas de recibir toques reemplazando el -hitTest:withEvent: método de su vista contenedora.

-hitTest:withEvent: por defecto devuelve el "descendiente lejano del receptor en la jerarquía de vistas (incluido él mismo) que contiene un punto especificado", lo que por defecto, al tocar uno de los botones, el cual incluye devolvería el botón .

Su aplicación debe ser algo como esto:

- (UIView *)hitTest:(CGPoint)aPoint withEvent:(UIEvent *)event { 
    if ([self pointInside:aPoint]) { 
     return self; 
    } else { 
     return nil; 
    } 
} 

Así que si su vista contenedora esto se llama en contiene el punto de contacto, que vuelve en sí y el reconocedor gesto que se le atribuye obtendrá el toque .

Como esta implementación nunca devuelve ninguna subvista, ninguno de los UIButtons tendrá la oportunidad de responder a los toques.

+0

Esto resultó no ser una buena idea. – jturolla

+2

¿Te importaría compartir * why *? – Ahti

+0

Tengo un botón en la "ventana emergente" que estoy ocultando mediante este método. Este botón no funcionará – jturolla

0

Sé que parece simplista, pero ¿ha considerado establecer la propiedad userInteractionEnabled de UIButton en "NO"? Eso debería eliminarlo automáticamente del sistema de prueba de golpes y reconocimiento de gestos.

+0

Este es ahora un buen camino. – jturolla

+0

¿Entonces podrías marcarme como correcto? – thebarcodeproject

+0

Lo siento mucho, pero este no es un buen camino. – jturolla

Cuestiones relacionadas