1

我有透明的UIView(我们称之为receiver)分层在具有UIScrollViewscrollView)的UIScrollViewDelegatescrollViewDelegate)上。

在某些情况下,receiver需要消耗落在它上面的触摸事件。在其他情况下,我需要收集一些位置信息,然后将触摸事件原封不动地传递给scrollView或欺骗事件,这些事件将包括拖动运动并导致适当的减速等。我该如何实现这一点?


编辑 - 迄今为止的研究:

我在scrollViewDelegate's中放置了一个断点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(我认为它必须是可能的,因为_UIGestureRecognizerSendActions它是吗?)。

或者,我想我可以子类UIGestureRecognizer化,但这似乎是一种相当笨拙的方式(我也不知道如何传达触摸事件的顺序)。

4

1 回答 1

3

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

然后,您可以执行以下两项操作之一:

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

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

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

于 2012-08-06T14:25:45.547 回答