2012-10-09 2 views
5

Ich habe Probleme mit der Responder-Kette von Ereignissen in einer iOS-App.Verhindern, dass die Elternansicht ein Berührungsereignis empfängt, nachdem die Kindansicht darauf reagiert

Das Problem ist das Folgende, ich habe eine Reihe von Subviews (Blasen) auf einer größeren Ansicht (Quadrat) und ich möchte eine bestimmte Ansicht zeigen, wenn ich auf die Tasten tippen, aber wenn ich irgendwo anders tippen Ich möchte die gleiche Ansicht verstecken.

Das Problem ist, wenn ich eine Blase klopfen, beide Ansichten (Kind und Eltern) auslösen, wie kann ich das verhindern?

Wenn das Kind bereits auf ein Berührungsereignis reagiert hat, sollte das nicht das Ende sein?

meine Blasen erkennen die Tap Geste mit UITapGestureRecognizer während der Elternansicht (Quadrat) touchesBegan verwendet: Methode

Dieser Graph meine aktuelle Setup mit mehreren Blasen erklärt:

enter image description here

Code:

@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"); 
} 

für Square

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

Nach einem Tap sehe ich beide NSLogs auf der Konsole

+0

pls enthält den Code –

+0

@ LithuT.V Codebeispiel enthielt – perrohunter

Antwort

3

Ich habe gefunden, was das Problem ist. UIView erbt von UIResponder, und grundlegende Berührungsereignisse werden von der Ansicht erkannt, die die Ereignisse der Berührungen auslöst. Die Unteransichten, die Sie in der Hauptansicht hinzugefügt haben, reagieren auch auf die Berührungsmethode. Dies ist sehr einfach. Sie haben außerdem eine Auswahlmethode mit der Erkennung von Tippgeste hinzugefügt. Jede Berührung von Blasen löst also sowohl die Methoden als auch die beiden Logs aus.Versuchen Sie, eine anderen Gestenerkenner die Ansicht mit einem anderen Wähler, wie

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

Nun, das ist das Problem. touchesBegan erhalten alle Berührungen, einschließlich der von der Gestenerkenner genommen. Sie können versuchen, gestureRecognizer.cancelsTouchesInView = TRUE oder TouchSBegan für Ihre Blasen zu setzen.

Da es scheint, dass Sie hier ein Spiel machen, verwenden Sie ein Motor wie cocos2D? Wenn das der Fall ist, gibt es einfachere Möglichkeiten, um zu erreichen, was Sie wollen.

Hoffe, das hilft.

Prost!

EDIT:

Wenn Sie nur Geste Erkenner verwenden, wird die Berührung nicht in die nächste Ansicht in der Hierarchie gesendet werden. Ich denke, das ist was du willst. Wenn Sie mit einem Hauch zu gehen entscheiden begann ich glaube, Sie so etwas tun sollte:

// in der Blase Ansichtsklasse

- (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

große Antwort! Ich denke, ich könnte das Quadrat auch ändern, um den Gestenerkenner-Tipp zu benutzen, aber gibt es eine Möglichkeit, das Ereignis davon abzuhalten, zum nächsten Antwortsender von der Blase zu gehen ?? – perrohunter

+0

PS: ist kein Spiel: p – perrohunter

1

tun:

@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

Sie sind keine Tasten :) Sie sind benutzerdefinierte UIView's – perrohunter

0

Warum nicht einen Hahn verwenden Gestenerkennung auch auf der Hauptansicht? Touches begann ist wie das Schreiben eigener Gestenerkennung, aber viel schwieriger. Bei mehreren Tap-Erkennern wird nur einer ausgelöst.

+0

Muss ich die Square-Erkenner von den Blasen oder rückwärts fehlschlagen müssen? – perrohunter

+1

@ PERR0_HUNTER Manchmal ist es schneller, es einfach selbst zu versuchen, anstatt darauf zu warten, dass jemand anderes es dir sagt. –

Verwandte Themen