2012-08-06 73 views
1

我有透明UIView(我们就叫它receiver)铺在UIScrollViewscrollView),其具有UIScrollViewDelegatescrollViewDelegate)。如何拦截触摸事件,并转发到指定的UIView

在某些情况下,receiver需要消耗触及它的触摸事件。在其他情况下,我需要收集一些位置信息,然后将触摸事件保持原样传递到scrollView,或者欺骗包含拖动的事件并导致适当的减速等。我如何实现这一点?


编辑 - 已有的研究结果:

我已经把scrollViewDelegate中的断点的scrollViewWillBeginDragging,从而揭示了调用顺序是:

(...various calls filtering down from UIApplicationMain...) 
[UIWindow sendEvent:] 
[UIWindow _sendGesturesForEvent:] 
... 
[UIGestureRecognizer _delayedUpdateGesture:] 
[UIGestureRecognizer _updateGestureWithEvent] 
_UIGestureRecognizerSendActions 
[UIScrollView handlePan:] 
[UIScrollView _updatePanGesture] 
.... 
[UIScrollViewDelegate scrollViewWillBeginDragging:] 

理想的情况下,我d喜欢能够打电话到UIScrollView handlePan:与适当的信息,但我找不到任何细节如何正确呼叫handlePan(我认为它必须是可能的,因为_UIGestureRecognizerSendActions是吗?)。

另外我想我可以继承UIGestureRecognizer,但这似乎做的相当重手的方式(并再次我不知道如何沟通的触摸事件序列)。

回答

2

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

那么你可以做两件事情之一:

  • 上滚动视图设置userInteractionsEnabledNO,如果你提前知道-的时间,该事件不应该被传递给它。事件将被传送到您的接收器视图。

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

如果你真的需要合成的事件,可以构建它们并将它们传递到UIApplication- (void)sendEvent:方法。 (直接调用handlePan:可能不会起作用,因为它需要UIGestureRecognizer,所以很难伪造。)

+0

非常好,这看起来正是我所需要的 - 将它编码并回复给您。干杯:) – sjwarner 2012-08-06 14:34:21

+0

是的,它的工作原理完全符合要求。谢谢您的帮助。 – sjwarner 2012-08-07 14:52:37