Prevent parent view from receiving touch event after child view acts on it

Well , that is the problem . touchesBegan will get all the touches , including the ones taken by the gesture recognizer. You can try to set gestureRecognizer.cancelsTouchesInView = TRUE or use touchesBegan for your bubbles too.

Since it seems that you are making a game here , are you using some engine like cocos2D ? If that's the case , there are easier ways to accomplish what you want.

Hope this helps.

Cheers!

EDIT:

If you are using only gesture recognizers , the touch will not be sent to the next view in the hierarchy. I think this is what you want. If you decide to go with touches began I think you should do something like this:

//in the bubble view class

- (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];
    }
}

I have found what the problem is. UIView inherits from UIResponder, and basic touch events are detected by the view that triggers the touches began events. The subviews that you added in the main view also responds to the touches began method.Thats very basic. You have also added a selector method with tap gesture recognizer. So any touch on bubbles trigger both the methods and hence the two logs. Try adding another gesture recognizer to the view with another selector, like

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];
}