在UIImageView的不同区域识别UIGesture

我有这个形象:

在这里输入图像说明

我想要做的是添加一个UITapGestureRecognizer这个图像(或者我可以拆分图像的不同部分组成,并为每个部分添加一个UITapGestureRecognizer),以便有不同的行动根据叶轻拍。 如果我将图像分成不同的图像,每个图像的UIImageViews可能会重叠,轻敲一个将被认为是另一个轻拍。 只有一个图像意味着要知道属于一个叶子的屏幕点,而不是另一个。

任何线索如何做到这一点将非常感激。 谢谢

通过检查手势识别器的locationInView:来改变你的行为。

如果您将图像作为一个单元处理,请在手势识别器callback中实现此function,以确定哪个“叶”(如果有)被点击。

如果将图像作为多个图像进行处理,则还可以在callback中实现该图像,或者也可以在例如您的委托的gestureRecognizerShouldBegin:抑制绘制的叶子外的触摸事件。

编辑:我没有意识到,你也可能正在寻找帮助,找出一个点是否在一片叶子内。 @PhillipMills在这一点上是正确的:我们需要知道你是如何绘制图像。

跟进:这是在我的专业领域之外。

从打击testing的angular度来看, 最简单的方法是使用Quartz绘图和CGPathContainsPoint()来完成@PhillipMills的build议。 如果你有需要渲染为PNG的详细graphics,那么你肯定可以构build一个简单的path,这个path将被(虚拟)覆盖以允许命中testing。

您的其他选项,AFAIK,将做mathtesting,但基本上是重新实现CGPathContainsPoint()但没有一个path,或使用各种技巧,看你的触摸点像素的颜色进行命中testing。 如果你走这条路线,谷歌search会产生一些有用的结果,但老实说,只要使用一些UIBezierPath代码在代码中重新创build一个简单的形状。

不知道这是否会有帮助,但如果你搞不清楚哪个叶子被点击了,你可以使用我们在CD-ROM项目中使用的旧的图像映射技巧,在图像上进行像素精确的点击跟踪。

你有你的全尺寸图像。 制作一个25%(或更less)的缩放版本。 用不同的颜色填充每个想要跟踪点击的叶子区域; 任何你想忽略的东西都会变黑。 点击完整大小的图像时,获取x / y坐标并按缩放图像的百分比缩放它们。 然后获取按比例缩放的x / y坐标的缩放图像的像素颜色。 通过确定像素颜色,您将知道哪个叶子被点击。

听起来笨重,但它运作得很好,速度很快。

(所有这一切,我不认为图像的阿尔法区域触发手势识别器 – 所以打破形象将不那么复杂/代码密集)。

如果可以将形状分解为组成元素,那么可以将每个元素放入其自己的图层中,并使用此堆栈溢出讨论中讨论的方法来确定触摸的内容: 使用CALayer内容的alpha属性命中testing