再次返回并使用我之前发布的相同功能提出不同的问题:
- (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子类而不是通过。
有更好的方法吗?
答案 0 :(得分:2)
也许“where”点与你的“自我”层无关。您需要使用以下方法在图层坐标系之间转换这些点:
- convertPoint:fromLayer:或 - convertPoint:toLayer:
答案 1 :(得分:0)
我通过将所有内容放在与原始尺寸相同的第二个“根”层(称为“gameLayer”)上来解决这个问题。然后在UIPanGestureRecognizer期间,我将炸弹元素从“gameLayer”移动到我的UIView.layer中。然后在我测试AIEnemyUnit时,我只在“gameLayer”上运行hitTest。
- UIView.layer --------- gameLayer
| |
dragObj(bomb) gameElements
|
bomb