我有一个包含许多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)位于左上角。我每次旋转都会重绘图层,但出于某种原因,它们似乎被映射为“正确”的方式,底部有主页按钮。我在处理轮换后错过了函数调用吗?
干杯, 亚当
答案 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);
}
}
}
虽然这种手动点转换工作正常,但问题仍然是原始方法调用没有的原因。有人可以开导我吗?
亚当