通过触摸两层处理(Touch handled by two layers)

2019-10-16 21:10发布

我有一个CCLayer包含一些其他的CCLayer S(如文本等项目)。 我还有一个CCLayer与我想显示一些这些“场景”的缩略图左侧。

左手CCScrollLayer应触摸属于其范围内作出响应,而在右手层的元素应该以他们各自的边界内的触摸做出响应。

我看到的问题是,当我拖累例如右侧的层,将CCScrollLayer向左的响应和滚动。 右边的元素不受影响,当我虽然滚动滚动层。 这是因为虽然CCScrollLayer的界限是太大了,他们是不是因为我甚至故意将它们设置为100个像素宽。 有没有在这里工作的原因不明的行为吗?

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

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

只是不要忘了转换触摸的UI坐标GL。 如果此方法返回YES,该触摸将不通过任何其它层接收。



Answer 2:

由于@Morion,仅此而已。 我的检测方法是这样的。

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


文章来源: Touch handled by two layers