我正在开发一个iOS 6.1版本的iPad应用程序。我在CALayer
和TapGestureRecognizer
方面遇到了问题。
我使用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中“在路径上执行点击检测”部分的说明进行操作。
在这种情况下,问题出在传递给该方法的路径变量上。我试图将传递的UIBezierPath
与RainbowView
中的路径进行比较,但没有结果。
我可以尝试创建曲线而不是路径。在这种情况下,可能不存在图形的填充部分,并且触摸区域仅限于描边。但是,我如何识别曲线上的触摸呢?
我对所有这些东西感到非常困惑! :D