iOS CALayer和TapGestureRecognizer

时间:2013-02-03 14:42:42

标签: ios uigesturerecognizer calayer

我正在开发iOS 6.1 for iPad上的应用程序。 我遇到了CALayer和TapGestureRecognizer的问题。

我有7个CALayers形成彩虹(每一层都是一种颜色)。 每个图层都是使用CGMutableLayer从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类,其中彩虹使用UIBezierPaths在drawRect方法中绘制。 然后我按照http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/BezierPaths/BezierPaths.html中的“在路径上执行命中检测”部分 在这种情况下,问题是传递给方法的路径变量。我尝试将传递的UIBezierPath与RainbowView中的路径进行比较但没有结果。

我可以尝试创建曲线而不是路径。在这种情况下,可能没有图的填充部分,并且触摸区域限于笔划。但那我怎么能识别曲线上的触摸?

我对所有这些东西都很困惑! :d

1 个答案:

答案 0 :(得分:2)

您面临的问题是,您在测试时再次检查图层的边框/边界,而不是再次检查形状图层的路径。

如果您的路径已填满,则应使用CGPathContainsPoint()来确定点按是否在路径内。如果你的路径没有被填满,而是被抚摸,我会引用你Ole Begemann's article about CGPath Hit Testing

为了使您的代码更清晰,您可以在自己的子类中进行命中测试。此外,除非在测试时图层是动画,否则使用presentationLayer是没有意义的。