问题描述:
在使用cocos2d做ui时,经常会遇到,需要弹出一个子界面,并且需要屏蔽下层界面的touch事件。而弹出框上某些区域,或者按钮可以响应touch事件。

解决方案步骤:

1> 给弹出框添加带吞噬能力的touch代理功能。

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority - 1 swallowsTouches:YES];

注意:
a>:代理是会被retain的。所以使用完后务必要移出。
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];

b>:priority其值越小,越是会优先响应touch事件。
这里使用kCCMenuTouchPriority - 1 既该界面的响应优先级比菜单按钮优先级低。

2> 实现代理方法ccTouchBegan:返回YES表示吞噬touch事件,则其他代理都不收到该事件了。
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{

return YES;
}

如果需要在某个区域内可以响应touch事件,则可以添加如下代码
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGRect aRect = CGRectMake(50, 50, 50, 50);
CGPoint touchpoint = [touch locationInView:[touch view]];
touchpoint = [[CCDirectorsharedDirector] convertToGL: touchpoint];
return !CGRectContainsPoint(aRect, touchpoint);
}

如果你希望除了菜单按钮以外的区域都不响应touch事件你也可以这样写:(假如我们的菜单是myMenu)
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{

if ([myMenu itemForTouch:touch])
{
return NO;
}

returnYES;
}
注意:其中itemForTouch:方法的使用有点技巧,提示这个方法是ccmenu的私有方法