如何拦截触摸事件并转发到指定的UIView

时间:2012-08-06 14:10:10

标签: ios ios4 uiscrollview

我有透明UIView(我们称之为receiver)分层在UIScrollViewscrollView)上,其UIScrollViewDelegate({{1} }})。

在某些情况下,scrollViewDelegate需要消耗落在其上的触摸事件。在其他情况下,我需要收集一些位置信息,然后将触摸事件原封不动地传递到receiver,或者可以欺骗包含拖动运动的事件并导致适当的减速等。我怎样才能实现这一点?


编辑 - 到目前为止的研究:

我在scrollView的{​​{1}}内加了一个断点,显示调用顺序为:

scrollViewDelegate

理想情况下,我希望能够使用适当的信息调用scrollViewWillBeginDragging,但我找不到任何详细说明如何正确调用(...various calls filtering down from UIApplicationMain...) [UIWindow sendEvent:] [UIWindow _sendGesturesForEvent:] ... [UIGestureRecognizer _delayedUpdateGesture:] [UIGestureRecognizer _updateGestureWithEvent] _UIGestureRecognizerSendActions [UIScrollView handlePan:] [UIScrollView _updatePanGesture] .... [UIScrollViewDelegate scrollViewWillBeginDragging:] 的内容(我认为必须有可能) ,因为UIScrollView handlePan:做到了吗?)。

或者我想我可以继承handlePan,但这似乎是一种非常沉重的做法(而且我不知道如何传达触摸事件的顺序)。

1 个答案:

答案 0 :(得分:2)

最简单的方法是将UIScrollView放在接收器内。

然后你可以做以下两件事之一:

  • 如果您事先知道事件不应传递给它,请将滚动视图上的userInteractionsEnabled设置为NO。事件将被发送到您的接收器视图。

  • 覆盖hitTest:withEvent:以记录传入的事件。为了压制它们,只需返回你的接收器(表明它应该是那些事件的目标);传递它们,从super的实现中返回值(在适当的时候将正确地将滚动视图标识为目标)。

如果您确实需要合成事件,可以构建它们并将它们传递给UIApplication的{​​{1}}方法。 (直接调用- (void)sendEvent:可能不起作用,因为它需要handlePan:,因此很难伪造。)