旋转后iPhone hitTest坏了

时间:2010-04-04 19:55:54

标签: iphone core-animation hittest

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

- (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)位于左上角。我每次旋转都会重绘图层,但出于某种原因,它们似乎被映射为“正确”的方式,底部有主页按钮。我在处理轮换后错过了函数调用吗?

干杯, 亚当

1 个答案:

答案 0 :(得分: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);
        }
    }
}

虽然这种手动点转换工作正常,但问题仍然是原始方法调用没有的原因。有人可以开导我吗?

亚当