2012-10-09 37 views
5

Tengo problemas con la cadena de eventos de respuesta en una aplicación iOS.Evitar que la vista principal reciba eventos táctiles después de que la vista infantil actúe en ella

El problema es el siguiente, tengo un conjunto de subvistas (burbujas) en una vista más grande (cuadrado) y quiero poder mostrar una cierta vista si toco los botones, sin embargo, si toco en otro lugar Quiero la misma vista para ocultar.

El problema es que cuando toco una burbuja, se activan ambas vistas (secundaria y principal), ¿cómo puedo evitar esto?

Si el niño ya actuó en un evento táctil ¿no debería ser eso el final?

mis burbujas están reconociendo el gesto Grifo con UITapGestureRecognizer mientras que la vista padre (cuadrado) utiliza touchesBegan: Método

Este gráfico explica mi configuración actual con múltiples burbujas:

enter image description here

Código:

@implementation Bubble 
... 
-(id) initWithFrame: (CGRect) frame { 
    UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerDTap.numberOfTapsRequired = 1; 
    [self addGestureRecognizer:singleFingerDTap]; 

} 

-(void) handleSingleTap { 
NSLog(@"Bubble tapped, show the view"); 
} 

para Square

@implementation Square 
... 
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"square touched, lets hide the view"); 
} 

Después de un grifo que ver tanto NSLogs en la consola

+0

pls incluyen el código –

+0

@ LithuT.V ejemplo de código incluido – perrohunter

Respuesta

3

He encontrado cuál es el problema. UIView hereda de UIResponder, y los eventos táctiles básicos son detectados por la vista que activa los toques para comenzar los eventos. Las subvistas que agregó en la vista principal también responden al método de inicio de toques. Es muy básico. También ha agregado un método de selector con el reconocedor de gestos de toque. Así que cualquier toque en las burbujas activará los métodos y, por lo tanto, los dos registros.Trate de añadir otra reconocedor gesto a la vista con otro selector, como

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tappedOnBubble)]; 
    [self.bubbleView addGestureRecognizer:tap]; 

UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tappedOnMainView)]; 
    [self.view addGestureRecognizer:tap2]; 


-(void)tappedOnMainView 
{ 
    NSLog(@"touched on main View"); 
    [self.vwToShow setHidden:NO]; 
} 
-(void)tappedOnView 
{ 
    NSLog(@"tapped on bubbleview"); 
    [self.vwToShow setHidden:YES]; 
} 
5

Bueno, ese es el problema. touchesBegan obtendrá todos los toques, incluidos los tomados por el reconocedor de gestos. Puede intentar configurar gestureRecognizer.cancelsTouchesInView = TRUE o utilizar touchesBegan para sus burbujas también.

Dado que parece que estás haciendo un juego aquí, ¿estás usando algún motor como cocos2D? Si ese es el caso, hay formas más sencillas de lograr lo que desea.

Espero que esto ayude.

¡Salud!

EDIT:

Si está utilizando sólo reconocedores gesto, el tacto no se enviará a la siguiente vista en la jerarquía. Creo que esto es lo que quieres. Si usted decide ir con toques comenzó Creo que deberías hacer algo como esto:

// en la clase de vista de la burbuja

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event 
{ 
    if(theTouchLocation is inside your bubble) 
    { 
     do something with the touch 
    } 
    else 
    { 
     //send the touch to the next view in the hierarchy (your large view) 
     [super touchesBegan:touches withEvent:event]; 
     [[self nextResponder] touchesBegan:touches withEvent:event]; 
    } 
} 
+0

gran respuesta! Creo que también podría cambiar el cuadrado para usar el toque del reconocedor de gestos, sin embargo, ¿hay alguna manera de evitar que el evento pase al siguienteResponder desde la burbuja? – perrohunter

+0

PD: no es un juego: p – perrohunter

1

hacer esto:

@implementation Square{ 

... 
-(id) initWithFrame: (CGRect) frame { 
    UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerDTap.numberOfTapsRequired = 1; 
    [self addGestureRecognizer:singleFingerDTap]; 

} 

-(void) handleSingleTap { 
    NSLog(@"Sqaure tapped, hide the view"); 
} 

} 
+0

No son botones :) son personalizados – perrohunter

0

por qué no utilizar un grifo reconocedor de gestos en la vista principal también? Toques comenzó es como escribir tu propio reconocedor de gestos, pero mucho más difícil. Con múltiples reconocedores de tap, solo uno disparará.

+0

de UIView ¿Necesito que el reconocedor Square falle de las burbujas o hacia atrás? – perrohunter

+1

@ PERR0_HUNTER A veces es más rápido intentarlo usted mismo en lugar de esperar a que alguien más le cuente. –

Cuestiones relacionadas