在子视图对其进行操作后,防止父视图接收触摸事件

per*_*ter 6 cocoa-touch objective-c uigesturerecognizer ios

我在iOS应用程序上遇到了响应者事件链的问题.

问题如下,我在一个更大的视图(正方形)上有一组子视图(气泡),如果我点击按钮,我希望能够显示某个视图,但是如果我点击其他任何地方我想要相同视图隐藏.

问题是当我点击一个气泡时,两个视图(孩子和父母)都在触发,我该如何防止这种情况?

如果孩子已经采取过触摸事件,那不应该结束吗?

My Bubbles正在使用UITapGestureRecognizer识别Tap手势,而父视图(square)使用touchesBegan:方法

此图表说明了我当前具有多个气泡的设置:

在此输入图像描述

码:

@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");
}
Run Code Online (Sandbox Code Playgroud)

为了广场

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

点击后我在控制台上看到两个NSLog

Geo*_*rge 6

嗯,这就是问题所在.touchesBegan将获得所有的触摸,包括手势识别器采取的触摸.您也可以尝试gestureRecognizer.cancelsTouchesInView = TRUE为您的气泡设置或使用touchesBegan.

既然你好像在这里制作游戏,你是否正在使用像cocos2D这样的引擎?如果是这种情况,可以通过更简单的方法来实现您的目标.

希望这可以帮助.

干杯!

编辑:

如果仅使用手势识别器,则不会将触摸发送到层次结构中的下一个视图.我想这就是你想要的.如果你决定开始接触,我认为你应该这样做:

//在bubble视图类中

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)


Mee*_*era 3

我已经找到问题所在了。UIView继承自UIResponder,基本的触摸事件由触发触摸开始事件的视图检测到。您在主视图中添加的子视图也会响应 Touchs Begin 方法。这是非常基本的。您还添加了带有点击手势识别器的选择器方法。因此,任何对气泡的触摸都会触发这两种方法,从而触发两条日志。尝试使用另一个选择器将另一个手势识别器添加到视图中,例如

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];
}
Run Code Online (Sandbox Code Playgroud)