我有透明UIView
(我们称之为receiver
)分层在UIScrollView
(scrollView
)上,其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
,但这似乎是一种非常沉重的做法(而且我不知道如何传达触摸事件的顺序)。
答案 0 :(得分:2)
最简单的方法是将UIScrollView
放在接收器内。
然后你可以做以下两件事之一:
如果您事先知道事件不应传递给它,请将滚动视图上的userInteractionsEnabled
设置为NO
。事件将被发送到您的接收器视图。
覆盖hitTest:withEvent:
以记录传入的事件。为了压制它们,只需返回你的接收器(表明它应该是那些事件的目标);传递它们,从super的实现中返回值(在适当的时候将正确地将滚动视图标识为目标)。
如果您确实需要合成事件,可以构建它们并将它们传递给UIApplication
的{{1}}方法。 (直接调用- (void)sendEvent:
可能不起作用,因为它需要handlePan:
,因此很难伪造。)