iOS CALayer和TapGestureRecognizer

3

我正在开发一个iOS 6.1版本的iPad应用程序。我在CALayerTapGestureRecognizer方面遇到了问题。

我使用7个CALayer组成彩虹(每个图层都是一种颜色)。每个图层都是使用CAShapeLayer生成的,生成方法是使用CGMutablePathRef。所有图层都能够成功绘制在屏幕上,我可以看到一条漂亮的彩虹。

现在我想要检测单个颜色/图层上的触摸事件。我尝试了以下方式:

- (void)tap:(UITapGestureRecognizer*)recognizer
{
   //I've had the tapGestureRecognizer to rainbowView (that is an UIView) in viewDidLoad
  CGLayer* tappedLayer = [rainbowView.layer.presentationlayer hitTest:[recognizer locationInView:rainbowView];

  if (tappedLayer == purpleLayer) //for example
         NSLog(@"PURPLE!");
}

我不明白为什么这段代码不起作用!我已经阅读了这里的其他主题:所有建议使用hitTest:方法来解决类似问题。但在我的情况下,我无法获得所需的结果。 有人可以帮助我吗?谢谢!!
编辑: 以下是路径和图层创建的代码:
- (void)viewDidLoad
{
     //Other layers
     ...
     ...
     //Purple Arc
     purplePath = CGPathCreateMutable();
     CGPathMoveToPoint(purplePath, NULL, 150, 400);
     CGPathAddCurveToPoint(purplePath, NULL, 150, 162, 550, 162, 550, 400);
     purpletrack = [CAShapeLayer layer];
     purpletrack.path = purplePath;
     purpletrack.strokeColor = [UIColor colorWithRed:134.0/255.0f green:50.0/255.0f blue:140.0/255.0f alpha:1.0].CGColor;
     purpletrack.fillColor = nil;
     purpletrack.lineWidth = 25.0;
     [rainbowView.layer insertSublayer:purpletrack above:bluetrack];
}

这是我对问题的第一个尝试,但触摸没有起作用。

我还尝试创建了一个名为RainbowView的类,在drawRect方法中使用UIBezierPaths绘制彩虹。然后我按照http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/BezierPaths/BezierPaths.html中“在路径上执行点击检测”部分的说明进行操作。 在这种情况下,问题出在传递给该方法的路径变量上。我试图将传递的UIBezierPathRainbowView中的路径进行比较,但没有结果。

我可以尝试创建曲线而不是路径。在这种情况下,可能不存在图形的填充部分,并且触摸区域仅限于描边。但是,我如何识别曲线上的触摸呢?

我对所有这些东西感到非常困惑! :D

1个回答

2
你遇到的问题是在测试命中时检查了图层的边框而不是形状图层的路径。如果你的路径是填充的,你应该使用CGPathContainsPoint()来确定点击是否在路径内。如果你的路径不是填充的,而是描边的,我建议你阅读Ole Begemann的关于CGPath Hit Testing的文章
为了使你的代码更清晰,你可以在你自己的子类中进行命中测试。此外,除非在命中测试时图层正在进行动画,否则使用presentationLayer是没有意义的。

谢谢你的建议!现在我正在阅读Ole Begemann的文章以更好地理解这种情况。再次感谢你。 - Niccolò Passolunghi
1
不幸的是,无论是CGPathContainsPoint()还是Ole Begemann的方法对我都不起作用。问题可能是我的图层彼此重叠。而且由于每个图层的“填充部分”始终存在,所以点击操作无法生效!也许我只能使用CGContextAddArcToPoint或类似的方法来创建仅包含描边的曲线。但是我不知道如何在单个曲线上进行点击操作。 - Niccolò Passolunghi
在这种情况下,问题需要关于您如何构建路径和图层的信息。 - David Rönnqvist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接