我有一个CCLayer
包含许多其他CCLayer
s(如文本项目等)。我在左侧有另一个CCLayer
,我想用它来显示许多这些“场景”的缩略图。
左手CCScrollLayer
应该响应其范围内的触摸,而右手层中的元素应该响应其各自界限内的触摸。
我看到的问题是,当我拖动右侧的图层时,左边的CCScrollLayer
正在响应并滚动。当我滚动滚动图层时,右边的元素不受影响。就好像CCScrollLayer
的边界太大了,它们不是因为我甚至故意将它们设置为100像素宽。在这里有无法解释的行为吗?
答案 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;
}
}