2012-10-09 24 views
5

iOSアプリケーションのレスポンダチェーンのイベントに問題があります。子ビューが子ビューで動作した後、親ビューがタッチイベントを受信しないようにします。

問題は次のとおりです。より大きなビュー(四角形)でサブビュー(泡)のセットがあり、ボタンをタップすると特定のビューを表示できるようにしたいのですが、私は同じ見方を隠しておきたい。

バブルをタップすると、両方のビュー(子と親)がトリガーしているときに、どのようにこれを防ぐことができますか?

すでにタッチイベントで動作していた子供がそれを最後にしてはいけませんか?親ビュー(正方形)touchesBeganを使用しながら、私の泡がUITapGestureRecognizerでタップジェスチャーを認識している

:メソッド

は、このグラフでは、複数の泡で私の現在の設定を説明します

enter image description here

コード:

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

(広場)

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

は、私は、コンソール

+0

ようPLSはLithuT.Vサンプルコード@コード –

+0

が – perrohunter

答えて

3

私は問題が何かを発見しました。 UIViewはUIResponderから継承し、基本的なタッチイベントは、タッチが開始されたイベントをトリガーするビューによって検出されます。メインビューで追加したサブビューは、メソッドの開始にも反応します。非常に基本的です。タップジェスチャ認識機能を備えたセレクタメソッドも追加しました。したがって、気泡に触れれば、方法と2つのログの両方がトリガーされます。

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

の両方NSLogsを参照してくださいをタップした後まあ、それが問題です。 touchesBeganは、ジェスチャ認識プログラムによって取得されたものを含むすべてのタッチを取得します。 gestureRecognizer.cancelsTouchesInView = TRUEに設定するか、あなたの気泡にtouchesBeganを使用することもできます。

ここでゲームを作っているようだから、cocos2Dのようなエンジンを使っていますか? そのような場合、あなたが望むものを達成するためのより簡単な方法があります。

これが役に立ちます。

乾杯!

EDIT:あなたが唯一のジェスチャー認識装置を使用している場合

、タッチは、階層内の次のビューに送信されません。私はこれがあなたが望むものだと思います。あなたはタッチで行くことにした場合、私はあなたがこのような何かやるべきだと思い始めました:タップを使用しないのはなぜ

@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

偉大な答えが含まれて含まれ、別のセレクタでのビューに別のジェスチャー認識を追加してみてください!ジェスチャーレコグナイザーのタップを使用するようSquareを変更することもできますが、バブルからnextResponderにイベントが送られるのを止める方法はありますか? – perrohunter

+0

PS:ゲームではありません:p – perrohunter

1

これを行いますジェスチャー認識機能もメインビューに表示されますか?触れ始めるのは、自分のジェスチャーレコグナイザーを書くようなものですが、はるかに難しいです。複数のタップ認識機能を使用すると、1つだけが起動します。

+0

これらはボタンではありません:)カスタムUIViewの – perrohunter

0

:バブルビュークラスで

//

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

四角形の認識機能が気泡や後方から失敗する必要がありますか? – perrohunter

+1

@ PERR0_HUNTER時には、誰かがあなたに話すのを待つのではなく、自分で試してみる方が早い場合もあります。 –

関連する問題