【问题标题】:UIGesture recognition on different areas of a UIImageViewUIImageView 不同区域的 UIGesture 识别
【发布时间】:2012-04-04 16:33:03
【问题描述】:

我有这张图片:

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

任何有关如何做到这一点的线索将不胜感激。 谢谢

【问题讨论】:

  • 您的图像是如何创建的?如果您是从路径中绘制它,您可以保存它们并检查路径是否包含接触点。
  • @PhillipMills 这是一个 .png 文件,因此它不是由应用程序绘制的。

标签: iphone ios uiimageview uigesturerecognizer


【解决方案1】:

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

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

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

编辑:我没有意识到您可能还在寻求帮助来确定一个点是否位于一片叶子内。 @PhillipMills 在这一点上是正确的:我们需要知道您是如何绘制图像的。

跟进:这有点超出我的专业领域。

最简单的方法(从命中测试的角度来看)是按照 @PhillipMills 的建议,使用 Quartz 绘图和 CGPathContainsPoint()。如果您有需要渲染为 PNG 的详细图形,您当然可以构建一个简单的路径,该路径将(实际上)覆盖以允许命中测试。

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

【讨论】:

  • 图片是.png文件。如果我将图像作为一个单元,我如何才能确定点击点在我的图片的某个叶子中的位置?!
  • 感谢提供线索,我从未使用过 UIBezierPath 但我会看看。干杯!
【解决方案2】:

不确定这是否会有所帮助,但如果您无法确定点击了哪片叶子,您可以使用我们在 CD-ROM 项目中使用的旧图像映射技巧来对图像进行像素精确的点击跟踪。

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

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

(话虽如此,我不认为图像的 alpha 区域会触发手势识别器 - 所以分解图像会不那么复杂/代码密集。)

【讨论】:

  • 图像应该用不同的颜色着色,所以如果我很难使用 Quartz 绘图(因为我以前从未这样做过),我将使用像素颜色技术。干杯!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多