2012-10-09 131 views
5

我在iOS應用程序的響應器事件鏈中遇到了問題。在子視圖作用於子視圖後,阻止接收觸摸事件的父視圖

問題是,我在一個更大的視圖(方形)上有一組子視圖(氣泡),我希望能夠顯示某個視圖,如果我點擊按鈕,但是如果我點擊其他地方我想要隱藏相同的觀點。

問題是當我點擊一個泡泡時,兩個視圖(孩子和父母)都觸發了,我該如何防止這種情況?

如果孩子已經對觸摸事件採取行動,那不應該是它的結束?

我的氣泡被識別與UITapGestureRecognizer敲擊手勢而父視圖(正方形)使用的touchesBegan:方法

該圖解釋了我的當前設置有多個氣泡:

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

for Square

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

一個點擊後,我看到控制檯

+0

請包括包括 –

+0

@ LithuT.V代碼示例!我想我也可以改變Square來使用手勢識別器的點擊,但是有沒有辦法阻止事件從bubble傳遞到nextResponder? – perrohunter

回答

3

我已經找到問題所在。 UIView從UIResponder繼承,並且觸發觸發開始事件的視圖檢測到基本觸摸事件。您在主視圖中添加的子視圖也會響應開始的方法。這非常基本。您還添加了輕擊手勢識別器的選擇器方法。因此,觸摸氣泡觸發方法,因此觸發兩個日誌。嘗試添加另一種姿態識別與另一選擇的觀點,像

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這樣的引擎? 如果是這樣,有更簡單的方法來完成你想要的。

希望這會有所幫助。

乾杯!

編輯:

如果你只使用手勢識別,觸摸不會被髮送到層次結構中的下一個視圖。我認爲這是你想要的。如果你決定去與觸摸開始,我認爲你應該做這樣的事情:

//在泡視圖類

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

+0

PS:不是遊戲:p – perrohunter

1

這樣做:

@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

它們不是按鈕:)它們是自定義UIView的 – perrohunter

0

爲什麼不使用自來水主視圖上的手勢識別器也是如此?開始觸摸就像寫自己的手勢識別器,但更難。有了多個輕拍識別器,只有一個會觸發。

+0

我是否需要要求Square識別器從氣泡或向後失效? – perrohunter

+1

@ PERR0_HUNTER有時只是自己嘗試而不是等待別人告訴你。 –

相關問題