Iphone CALayer-hitTest:不考虑容器点:过载
再次返回,有一个与我之前发布的相同功能的不同问题:Iphone CALayer-hitTest:不考虑容器点:过载,iphone,ipad,calayer,hittest,Iphone,Ipad,Calayer,Hittest,再次返回,有一个与我之前发布的相同功能的不同问题: - (AIEnemyUnit *) hitTestForEnemyUnit:(CGPoint)where { CALayer * layer = [self hitTest:where]; while (layer) { if ([layer isKindOfClass:[AIEnemyUnit class]]) { return (AIEnemyUnit *)layer;
- (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:
来实现相同的技术,但它仍然返回bomb的通用CALayer子类,而不是通过
有更好的方法吗?也许“何处”点与你的“自我”层无关。需要使用以下方法在图层坐标系之间转换这些点:
–转换点:fromLayer:或
–转换点:托莱耶:
请参阅:我通过将所有内容放在第二个“根”层(称为“游戏层”)上解决了这个问题,该层的大小与原始层相同。然后在UIPangestureRecognitor期间,我将炸弹元素从“gameLayer”移动到我的UIView.layer中。然后,当我测试AIEnemyUnit时,我只在“游戏玩家”上运行hitTest
不,没有额外的层,确切的代码工作得很好,而且一些元素非常小,所以我知道“where”功能正常。
- UIView.layer --------- gameLayer
| |
dragObj(bomb) gameElements
|
bomb