3

我有一个 UIView 包含许多 CALayer 子类。我正在使用以下代码来检测触摸事件对应于哪一层:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
NSLog(@"%@,%@",NSStringFromCGPoint(point),[self.layer hitTest:point].name);


}

在设备旋转之前,这可以正常工作。当设备旋转时,所有当前层都从超层中移除,并创建新的 CALayers 以适应新的方向。新图层已正确插入并可按正确方向查看。

旋转后,hitTest 方法始终为图层返回 null。我注意到,当旋转 180 度时,返回的图层是旋转前位于该位置的图层,即触摸左上角的图层会在旋转 180 度时在右下角的图层。命中测试的坐标按预期打印,左上角为 (0,0)。我在每次旋转时重新绘制图层,但由于某种原因,它们似乎被映射为“正确”的向上方式,底部有主页按钮。处理旋转后我是否错过了函数调用或其他内容?

干杯,亚当

4

1 回答 1

4

好的,我发现以下代码可以在所有方向上正常工作,没有任何问题(在我的情况下,没有重叠的视图,所以这适合我):

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *t = [touches anyObject];

    CGPoint point = [t locationInView:self];

    for(CALayer *layer in self.layer.sublayers) {

        CGPoint convertedPoint = [self.layer convertPoint:point
                                                  toLayer:layer];

        if([layer containsPoint:convertedPointPoint]) {
            NSLog(@"%@",layer.name);
        }
    }
}

虽然这种手动点转换工作正常,但问题仍然存在,为什么原始方法调用没有。有人可以启发我吗?

亚当

于 2010-04-05T13:23:38.343 回答