触摸事件由多个视图处理

时间:2011-12-03 20:09:28

标签: ios touch touchesmoved touch-event uievent

我在UIView之上有一个UITableView的子类。我使用UITableView来显示一些数据,同时,我想覆盖手指后面的动画(例如,留下一条线索)。

如果我做得对,我需要UIView子类和UITableView处理两者的触摸事件。我怎样才能做到这一点? 是否有可能在UIView子类上触发touchesMoved,然后在UITableView上触发?

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:11)

我解决这个问题的方式不是那么干净,但它有效。如果有更好的方法,请告诉我。

我已为我的自定义hitTest覆盖了UIView,因此它会将触摸指向下方的UITableView。然后在UITableView我通过touchesBegantouchesMoved等处理手势。我还在touchesBegan上拨打UIView

这样,触摸由两个视图处理。 我没有反过来的原因(让UIView touchesBegan调用UITableView的{​​{1}})是touchesBegan上的手势识别器不行。

UITableView子类'UIView

hitTest

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // tview is the UITableView subclass instance CGPoint tViewHit = [tView convertPoint:point fromView:self]; if ([tView pointInside:tViewHit withEvent:event]) return tView; return [super hitTest:point withEvent:event]; } 子类的UITableView

touchesBegan

答案 1 :(得分:1)

不,你不能做到这一点。 Event Delivery章节说

  

窗口对象使用命中测试和响应者链来查找   查看接收触摸事件。在命中测试中,窗口调用   hitTest:withEvent:在视图层次结构的最顶层视图上;这个   方法通过递归调用pointInside:withEvent:on each   视图层次结构中的视图返回YES,继续向下   层次结构,直到找到触摸范围内的子视图   发生。该视图成为热门测试视图。

因此,当窗口找到触摸的视图时,它返回YES。目前只有一个视图可以处理触摸。

但是如果您需要为UITableView处理事件,那么为UIView处理它!您可以使用– convertPoint– convertRect函数将触摸点转换为所需坐标,将子视图添加到UITableView并移动它取决于坐标和许多其他内容。

答案 2 :(得分:0)

UITableView将未处理的触摸事件传递给UIView。 (谷歌“响应链”) UITableView Documentation

因此,您只能在UIView中处理触摸事件。所以。在你的UIView

  1. touchesstart - 做初始化的东西

  2. touchesmove - 在UIView上绘制尾部(使用timers / delayedresponse到desa​​ble点,使它看起来像一条小道)

  3. touchesend - 做剩下的事情

  4. 希望这有帮助。