1

私はCCLayerCCLayerの多くのを含んでいます(テキストのアイテムなど)。CCLayer左側にもう1つあり、これらの「シーン」のサムネイルを表示したいと思います。

左側の手CCScrollLayerはその境界内のタッチに応答する必要があり、右側のレイヤーの要素は個々の境界内のタッチに応答する必要があります。

私が見ている問題は、たとえば右側のレイヤーをドラッグするCCScrollLayerと、左側のレイヤーが応答してスクロールしていることです。ただし、スクロールレイヤーをスクロールしても、右側の要素は影響を受けません。のCCScrollLayer境界が大きすぎるようですが、意図的に100ピクセル幅に設定したからではありません。ここで説明のつかない動作が働いていますか?

効果はhttp://imageshack.us/photo/my-images/210/dragd.png/で見ることができます

4

2 に答える 2

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 を返した場合、このタッチは他のレイヤーによって受信されません。

于 2012-06-16T01:33:58.450 に答える
0

ありがとう@モリオン、それでした。私の検出方法は次のようになります。

   StoryElementLayer *newLayer = nil;
   for (StoryElementLayer *elementLayer in self.children) {
        if (CGRectContainsPoint(elementLayer.boundingBox, touchLocation)) {            
            newLayer = elementLayer;
            break;
        }
    }   
于 2012-06-16T10:21:04.113 に答える