我有这张图片:
我想要做的是向该图像添加一个 UITapGestureRecognizer(或者我可以将图像拆分为它所包含的不同部分,并为每个部分添加一个 UITapGestureRecognizer),以便根据被点击的叶子执行不同的操作。如果我将每个叶子的图像拆分为不同的图像,则 UIImageViews 可能会重叠,并且点击一个将被识别为点击另一个。只有一个图像意味着知道屏幕上属于一片叶子而不是另一片叶子的点。
任何有关如何做到这一点的线索将不胜感激。谢谢
我有这张图片:
我想要做的是向该图像添加一个 UITapGestureRecognizer(或者我可以将图像拆分为它所包含的不同部分,并为每个部分添加一个 UITapGestureRecognizer),以便根据被点击的叶子执行不同的操作。如果我将每个叶子的图像拆分为不同的图像,则 UIImageViews 可能会重叠,并且点击一个将被识别为点击另一个。只有一个图像意味着知道屏幕上属于一片叶子而不是另一片叶子的点。
任何有关如何做到这一点的线索将不胜感激。谢谢
通过检查手势识别器的locationInView:
.
如果您将图像作为一个单元处理,请在您的手势识别器回调中实现这一点,以决定点击了哪个“叶子”(如果有的话)。
如果您将图像作为多个图像处理,您也可以在回调中实现它,或者您也可以在例如您的委托中实现,gestureRecognizerShouldBegin:
以抑制绘制的叶子外部的触摸事件。
编辑:我没有意识到您可能还在寻求帮助来确定一个点是否位于一片叶子内。@PhillipMills 在这一点上是正确的:我们需要知道您是如何绘制图像的。
跟进:这有点超出我的专业领域。
最简单的方法(从命中测试的角度来看)是按照@PhillipMills 的建议,使用 Quartz 绘图和CGPathContainsPoint()
. 如果您有需要渲染为 PNG 的详细图形,您当然可以构建一个简单的路径,该路径将(实际上)覆盖以允许命中测试。
您的其他选择,AFAIK,是在数学上进行命中测试,但您基本上会重新实现CGPathContainsPoint()
但没有路径,或者采用各种技巧来查看触摸点处像素的颜色来进行命中测试。如果你走这条路,谷歌搜索会得到一些有用的结果,但老实说,对于像你绘制的那样简单的形状,只需使用一些UIBezierPath
代码在代码中重新创建。
不确定这是否会有所帮助,但如果您无法确定点击了哪个叶子,您可以使用我们在 CD-ROM 项目中使用的旧图像映射技巧来对图像进行像素精确的点击跟踪。
你有你的全尺寸图像。制作一个 25%(或更少)的缩放版本。用不同的颜色填充每个要跟踪点击的叶子区域;任何你想忽略的东西都会变黑。单击全尺寸图像时,获取 x/y 坐标并按缩放图像的百分比对其进行缩放。然后在缩放的 x/y 坐标处获取缩放图像的像素颜色。通过确定像素颜色,您将知道单击了哪个叶子。
听起来很笨拙,但它工作得很好而且速度很快。
(话虽如此,我不认为图像的 alpha 区域会触发手势识别器 - 所以分解图像会不那么复杂/代码密集。)
如果您可以将形状分解为组成元素,那么您可以将每个元素放入它自己的图层中,并使用此 stackoverflow 讨论中讨论的方法来确定哪个被触摸:使用 CALayer 内容的 alpha 属性使用 CALayer 进行命中测试