CALayer -hitTest:不尊重containsPoint:overload

时间:2010-09-30 06:01:40

标签: iphone ipad calayer hittest

再次返回并使用我之前发布的相同功能提出不同的问题:

- (AIEnemyUnit *) hitTestForEnemyUnit:(CGPoint)where {
    CALayer * layer = [self hitTest:where];

    while (layer) {
        if ([layer isKindOfClass:[AIEnemyUnit class]]) {
            return (AIEnemyUnit *)layer;
        } else {
            layer = layer.superlayer;
        }
    }

    return nil;
}

我有一个炸弹,用户拖动敌人的顶部,以便它直接显示在AIEnemyUnit上方。对于这个炸弹,我实现了CALayer -containsPoint:以在拖动期间返回NO以允许-hitTest:穿过该层。基本上,只要我只使用CGImageRef上下文,这种类型的命中测试就可以正常使用这些“传递”层。然而,一旦我开始实施子层以对炸弹产生额外的影响,-hitTest:立即爆发。显而易见,新层正在捕获-hitTest:。我尝试通过为这些图层重载-containsPoint:来实现相同的技术,但它仍然返回炸弹的通用CALayer子类而不是通过。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

也许“where”点与你的“自我”层无关。您需要使用以下方法在图层坐标系之间转换这些点:

- convertPoint:fromLayer:或 - convertPoint:toLayer:

请参阅http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/convertPoint:fromLayer

答案 1 :(得分:0)

我通过将所有内容放在与原始尺寸相同的第二个“根”层(称为“gameLayer”)上来解决这个问题。然后在UIPanGestureRecognizer期间,我将炸弹元素从“gameLayer”移动到我的UIView.layer中。然后在我测试AIEnemyUnit时,我只在“gameLayer”上运行hitTest。

- UIView.layer --------- gameLayer 
           |                |
     dragObj(bomb)     gameElements
                            |
                           bomb