仅对 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 方法中的动画混淆