触摸由两层处理

时间:2012-06-15 18:24:58

标签: iphone ios cocos2d-iphone cclayer

我有一个CCLayer包含许多其他CCLayer s(如文本项目等)。我在左侧有另一个CCLayer,我想用它来显示许多这些“场景”的缩略图。

左手CCScrollLayer应该响应其范围内的触摸,而右手层中的元素应该响应其各自界限内的触摸。

我看到的问题是,当我拖动右侧的图层时,左边的CCScrollLayer正在响应并滚动。当我滚动滚动图层时,右边的元素不受影响。就好像CCScrollLayer的边界太大了,它们不是因为我甚至故意将它们设置为100像素宽。在这里有无法解释的行为吗?

效果可以在http://imageshack.us/photo/my-images/210/dragd.png/

看到

2 个答案:

答案 0 :(得分:1)

默认情况下,CCLayer注册为标准触摸代理。您必须将其注册为目标代表。在这种情况下,CCLayer可以声称触摸,其他可触摸元素将不会接收它。您可以通过覆盖CCLayer方法

来实现
-(void) registerWithTouchDispatcher
{
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: self.priority swallowsTouches:YES];
}

之后你必须用这些方法替换你的委托方法

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@optional
// touch updates:
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;

您的ccTouchBegan:withEvent:方法应该是这样的

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL shouldClaimTouch = NO;
    BOOL layerContainsPoint = // check if current layer contains UITouch position
    if( layerContainsPoint )
    {
        shouldClaimTouch = YES;
    }

    // do anything you want

    return shouldClaimTouch;
}

只是不要忘记将touch的UI坐标转换为GL。如果此方法返回YES,则任何其他图层都不会接收此触摸。

答案 1 :(得分:0)

谢谢@Morion,就是这样。我的检测方法看起来像这样。

   StoryElementLayer *newLayer = nil;
   for (StoryElementLayer *elementLayer in self.children) {
        if (CGRectContainsPoint(elementLayer.boundingBox, touchLocation)) {            
            newLayer = elementLayer;
            break;
        }
    }