2010-04-04 92 views
2

我有一个UIView包含一些CALayer子类。我正在使用以下代码来检测触摸事件对应的图层:iPhone hitTest轮换后损坏

- (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

好吧,我发现下面的代码在所有方向工作没有任何问题(在我的情况下,有没有重叠的意见,这是适合我):

-(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); 
     } 
    } 
} 

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

Adam