iphone - 触摸由两层处理

标签 iphone ios cocos2d-iphone cclayer

我有一个 CCLayer 包含许多其他 CCLayer(如文本项等)。我在左侧有另一个 CCLayer,我想用它显示许多这些“场景”的缩略图。

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

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

效果可见http://imageshack.us/photo/my-images/210/dragd.png/

最佳答案

默认情况下,CCLayer 注册为标准触摸委托(delegate)。您必须将其注册为目标委托(delegate)。在这种情况下,CCLayer 可以声明触摸,而其他可触摸元素将不会接收它。您可以通过重写 CCLayer 方法来实现

-(void) registerWithTouchDispatcher
{
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: self.priority swallowsTouches:YES];
}

在此之后,您必须用这些方法替换您的委托(delegate)方法

- (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,则此触摸将不会被任何其他层接收。

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

相关文章:

iphone - iPhone 中的动态文本字段是否可行?

IOS - 在 Cocos2d 中使用 CCCallBlock,小行星游戏

ios - 如何在 XCode 6 中添加本地化?

android - flutter 运行错误,并且gradle失败,退出代码为1

ios - 相机如何跟踪两件事? cocos2d

ios - 添加评分标签 Cocos2d 3.0

ios - 带有自动保存的 UIDocument 何时保存文件

iphone - 如何实现iTunes内置App "File Sharing"功能

iphone - objective-c : i want the automatic memory management of properties, 但无法从其他类访问

ios - 为什么我不能在 Alamofire 4.0 中使用 SessionManager 初始化或发出请求? (更新)