2012-08-06 89 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