我有一个CCLayer,其中包含许多其他CCLayer(例如文本项等)。我在左侧还有另一个CCLayer,要用来显示其中许多“场景”的缩略图。

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

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

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

最佳答案

默认情况下,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。如果此方法返回“是”,则任何其他层都不会接收到此触摸。

关于iphone - 两层触控,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11056222/

10-11 12:44