我一直在为iOS开发一个简单的游戏,包括拖动和使用旋转和其他手势识别器。通过touchesBegan/Moved/Ended
和旋转式识别器实现了拖放.
视图形状不规则,视图边框有时重叠,因此我在图片视图中实现了Ole Belgeman的UIImage+ColorAtPixel,并在主元素视图中重写了isPointInside
方法。isPointInside调用图片视图中的方法,该方法在触点处检查alpha,如果触摸到透明部分,则返回NO。本质上,hitTest
忽略了这个分支。
但是它的副作用是hitTest忽略了对透明部分的所有接触,旋转识别器只在非透明区域工作。对于一些大小太小的视图,不可能使用旋转姿态:
有没有办法避免这个问题,并使用hitTest
逻辑only for touchesBegan
?我试图找出解决方案,但似乎hitTest在任何触摸处理之前都是严格工作的。
在touchesBegan
上检查透明性是有效的,但是当您触摸透明部分(它与另一个视图的非透明部分重叠)时,后者不会接收到触摸。
我就是搞不懂这个把戏..。
提前感谢您的帮助!
发布于 2011-11-26 20:11:55
我会让拖动使用一个UIPanGestureRecognizer,这样当您的pan识别器考虑在透明区域中进行触摸时,您可以实现委托方法-gestureRecognizer:shouldReceiveTouch:来返回NO
。保持未实现的状态,或者从旋转识别器返回YES
以接收所有信息。
此外,在这两种操作中使用手势识别器还有其他好处,比如能够使用-requireGestureRecognizerToFail:指定依赖项。
发布于 2011-05-08 23:27:20
尝试检查传递给pointInside:withEvent:当它来自手势识别器的UIEvent参数是否与从touchBegan/Moved/Ended调用时传递的参数不同。
如果它是不同的,那么我想这是解决你的问题。
只需在NSLog上放置一个断点或pointInside,以查看每种情况下的事件参数,并查看是否可以区分。
祝好运!
https://stackoverflow.com/questions/5880109
复制相似问题