在UIImageView的不同区域上进行UIGesture识别

时间:2012-04-04 16:33:04

标签: iphone ios uiimageview uigesturerecognizer

我有这张图片:

enter image description here

我想要做的是为此图像添加一个UITapGestureRecognizer(或者我可以将图像分成它所包含的不同部分,并为每个部分添加一个UITapGestureRecognizer),以便根据抽取的叶子进行不同的操作。如果我将每个叶子的图像分成不同的图像,UIImageViews可能会重叠,点击其中一个将被识别为点击另一个。只有一个图像意味着知道屏幕上属于叶子而不是另一个叶子的点。

任何关于如何做到这一点的线索都会非常感激。 谢谢

3 个答案:

答案 0 :(得分:2)

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

如果您将图像作为一个单元处理,请在手势识别器回调中实现此功能,以决定点击哪个“叶子”(如果有)。

如果您将图像作为多个图像处理,您也可以在回调中实现它,或者您也可以在例如代理人的gestureRecognizerShouldBegin:中实现,以抑制绘制的叶子外部的触摸事件。

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

后续行动:这有点超出我的专业领域。

最简单的方法(从命中测试的角度来看)是使用Quartz绘图和CGPathContainsPoint()来完成@PhillipMills所建议的。如果您有需要呈现为PNG的详细图形,那么您当然可以构建一个简单的路径(实际上),以便进行命中测试。

您的其他选项,AFAIK,将以数学方式进行命中测试,但您基本上会重新实现CGPathContainsPoint()但没有路径,或者使用各种技巧来查看触摸点处的像素颜色做打击测试。如果你走这条路线,谷歌搜索将会显示一些有用的结果,但老实说,对于一个像你绘制的那样简单的形状,只需使用一些UIBezierPath代码在代码中重新创建。

答案 1 :(得分:1)

不确定这是否会有所帮助,但是如果你不知道找出哪个叶片被点击了,你可以使用我们过去在CD-ROM项目中使用的旧图像映射技巧来对图像进行像素精确点击跟踪。

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

听起来很笨,但效果很好而且很快。

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

答案 2 :(得分:0)

如果您可以将形状分解为组成元素,那么您可以将每个元素放入其自己的图层中,并使用此stackoverflow讨论中讨论的方法来确定触及的内容:Hit Testing with CALayer using the alpha properties of the CALayer contents