【问题标题】:CALayer -hitTest: not respecting containsPoint: overloadCALayer -hitTest:不尊重 containsPoint:重载
【发布时间】:2010-09-30 06:01:39
【问题描述】:

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

- (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 子类,而不是通过。

有没有更好的办法?

【问题讨论】:

    标签: iphone ipad calayer hittest


    【解决方案1】:

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

    – convertPoint:fromLayer: 或 – 转换点:toLayer:

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

    【讨论】:

    • 不,确切的代码在没有附加层的情况下运行良好,并且一些元素非常小,所以我知道“哪里”运行正常。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多