我有一个CCLayer
包含一些其他的CCLayer
S(如文本等项目)。 我还有一个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;
}
只是不要忘了转换触摸的UI坐标GL。 如果此方法返回YES,该触摸将不通过任何其它层接收。
由于@Morion,仅此而已。 我的检测方法是这样的。
StoryElementLayer *newLayer = nil;
for (StoryElementLayer *elementLayer in self.children) {
if (CGRectContainsPoint(elementLayer.boundingBox, touchLocation)) {
newLayer = elementLayer;
break;
}
}