我有一個UITableView
,我出現在UIPopoverController
。表視圖顯示了可以拖放到主視圖上的元素列表。自定義UIGestureRecognizer不按預期方式工作
當用戶開始主要垂直的平移手勢時,我想讓UITableView
照常滾動。當它一開始並不是垂直的時候,我希望應用程序將其解釋爲一個拖放操作。
我不幸在這條路上漫長的旅程迫使我創建一個自定義UIGestureRecognizer
。在試圖得到基本正確的,我離開了這個習俗gesturer作爲第一個空的實現,一個只調用每五個自定義方法蘋果稱的超級版本應該重寫:
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
(void)reset;
此結果在沒有任何事情發生的情況下,即從未調用自定義手勢的動作方法,並且表視圖像往常一樣滾動。
對於我的下一個實驗,我在touchesBegan
方法中將手勢狀態設置爲UIGestureRecognizerStateBegan
。
這導致手勢的動作方法觸發,使手勢看起來像標準UIPanGestureRecognizer
一樣行爲。這顯然表明我負責管理手勢的狀態。
接下來,我在touchesMoved
方法中將手勢狀態設置爲UIGestureRecognizerStateChanged
。一切都還好。
現在,我嘗試在touchesMoved
方法中將手勢的狀態設置爲UIGestureRecognizerStateFailed
。我期待這個結束手勢並將事件流恢復到表視圖,但事實並非如此。它所做的只是停止觸發手勢的操作方法。
最後,我在touchesBegan
方法中將手勢狀態設置爲UIGestureRecognizerStateFailed
,之後我立即將其設置爲UIGestureRecognizerStateBegan
。
這會導致手勢只觸發其操作方法一次,然後將所有後續事件傳遞給表視圖。
所以......對於這麼長的問題抱歉......但是爲什麼如果我在touchesBegan
方法中導致手勢失敗(在首次將狀態設置爲UIGestureRecognizerStateBegan
之後),它是否將事件重定向到表視圖,如預期。但是如果我在touchesMoved
(我可以檢測到移動主要是垂直的唯一位置)嘗試相同的技術,那麼爲什麼不會發生這種重定向?
@Caleb ...這是有道理的,但我認爲事件流是,命中測試視圖確實接收觸摸事件,直到手勢識別器識別手勢或將其狀態設置爲UIGestureRecognizerStateFailed。在後者的情況下,即失敗,難道你不希望命中測試視圖只是繼續處理觸摸嗎?如果不是,那麼在自定義手勢識別器失敗之後,如何獲得觸碰測試視圖來處理觸摸? – wayne