仅对 touchesBegan 和 NOT 手势识别器使用 hitTest 逻辑

Posted

技术标签:

【中文标题】仅对 touchesBegan 和 NOT 手势识别器使用 hitTest 逻辑【英文标题】:Using hitTest logic only for touchesBegan and NOT gesture recognizers 【发布时间】:2011-05-04 07:37:39 【问题描述】:

我一直在为 ios 开发一个简单的游戏,其中涉及拖动和使用旋转以及其他手势识别器。拖拽是通过touchesBegan/Moved/Ended实现的,旋转是通过识别器实现的。

视图形状不规则,视图边界有时会重叠,因此我在我的图片视图中实现了 Ole Belgeman 的UIImage+ColorAtPixel,并在主元素视图中覆盖了isPointInside 方法。 isPointInside 调用 图片视图 中的方法,该方法检查触摸点的 alpha,如果已触摸透明部分,则返回 NO。本质上,hitTest 忽略了这个分支。

但它的副作用是 hitTest 会忽略透明部分的所有触摸,而旋转识别器仅适用于非透明区域。对于某些尺寸太小的视图,无法使用旋转手势:(

有没有什么办法可以避免这个问题,并为touchesBegan 使用hitTest 逻辑only?我试图找出解决方案,但似乎 hitTest 在任何触摸处理之前都严格工作。

touchesBegan 检查透明度有效,但是当您触摸与另一个视图的非透明部分重叠的透明部分时,后者不会收到触摸。

我就是想不通……

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

我会让拖动使用UIPanGestureRecognizer,这样当您的平移识别器考虑在透明区域进行触摸时,您可以实现委托方法-gestureRecognizer:shouldReceiveTouch: 以返回NO。让它未实现或从您的旋转识别器返回YES 以接收所有内容。

此外,为这两种操作使用手势识别器还有其他好处,例如能够使用-requireGestureRecognizerToFail: 指定依赖关系。

【讨论】:

【参考方案2】:

尝试检查从手势识别器传递给pointInside:withEvent:的UIEvent参数是否与从touchBegan/Moved/Ended调用时传递的不同。

如果它不同,那么我想这可以解决你的问题。

只需在 pointInside 放置一个断点或 NSLog 即可查看每种情况的 Event 参数,看看是否可以区分。

祝你好运!

【讨论】:

以上是关于仅对 touchesBegan 和 NOT 手势识别器使用 hitTest 逻辑的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 和 touchesBegan / touchesEnded 等

如何使用 touchesBegan 和 touchesEnded?

Spritekit 通过 touchesBegan 暂停和恢复 SKSpriteNode 的动作

CollectionView 与 touchesBegan 和 touchesEnded 方法中的动画混淆

如何将 touchesBegan 和 touchesEnded 限制为仅一次触摸?

touchesBegan 时 UIBarButtonItem 的扩展