我有这张图片:
我想要做的是为此图像添加一个UITapGestureRecognizer(或者我可以将图像分成它所包含的不同部分,并为每个部分添加一个UITapGestureRecognizer),以便根据抽取的叶子进行不同的操作。如果我将每个叶子的图像分成不同的图像,UIImageViews可能会重叠,点击其中一个将被识别为点击另一个。只有一个图像意味着知道屏幕上属于叶子而不是另一个叶子的点。
任何关于如何做到这一点的线索都会非常感激。 谢谢
答案 0 :(得分:2)
通过检查手势识别器的locationInView:
来改变您的行为。
如果您将图像作为一个单元处理,请在手势识别器回调中实现此功能,以决定点击哪个“叶子”(如果有)。
如果您将图像作为多个图像处理,您也可以在回调中实现它,或者您也可以在例如代理人的gestureRecognizerShouldBegin:
中实现,以抑制绘制的叶子外部的触摸事件。
后续行动:这有点超出我的专业领域。
最简单的方法(从命中测试的角度来看)是使用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