2012-03-20 44 views
7

我正在創建一個自定義UIView並在其上添加一個UITapGestureRecognizer。我有一個輕拍手勢的處理程序。但同時我想讓我的UIView聽touchesBegan & touchesEnded方法。我已經實現了gestureRecognizer:shouldReceiveTouch:方法,但touchesBegan/touchesEnded方法不會被調用。任何線索爲什麼?與UIGestureRecognizer一起聽UITouch事件

在我的自定義的UIView

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)iGestureRecognizer shouldReceiveTouch:(UITouch *)iTouch { 
    return YES; 
} 

裏面我的視圖控制器

MyCustomView aCustomView = [[[MyCustomView alloc] init] autorelease]; 
       UIGestureRecognizer *myGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
[aCustomView addGestureRecognizer:myGestureRecognizer]; 
       [myGestureRecognizer release]; 
+0

我一直以爲的touchesBegan只適用於主的viewController的視圖。 – CodaFi 2012-03-20 01:10:24

回答

10

您需要設置cancelsTouchesInView(可能delaysTouchesBegandelaysTouchesEnded),以NO的手勢識別。手勢識別器的默認行爲是爲了避免它和視圖都處理觸摸。這些設置可讓您調整該行爲。

+0

我當然希望我得到你提到的那種行爲。我正在使用默認設置,但我的觸摸方法仍然被調用。看到我的問題在這裏:http://stackoverflow.com/questions/15869944/how-to-prioritize-gesture-recognizers-and-touches-in-a-uiview – johnbakers 2013-04-08 01:58:18

+0

@RobNapier將無法把cancelsTouchesInView鏈接到我的問題在這裏:https://stackoverflow.com/questions/46170876/random-crash-on-pickerview-didselect-cfrunloop-is-calling-out-to-a-source1-p?noredirect=1#comment79305779_46170876 – user2363025 2017-09-15 09:33:22

0

如前所述,您需要在您的UITapGestureRecognizer上將cancelTouchesInView屬性設置爲NO

從Apple文檔:

cancelsTouchesInView,如果一個手勢識別器識別出它的姿態, 它解除綁定手勢的剩餘觸摸從他們的觀點(所以 窗口將不會帶來他們)。該窗口取消之前的 傳送的觸摸(touchesCancelled:withEvent :)消息。如果手勢識別器不識別其手勢,則該視圖將在多點觸摸序列中接收到所有觸摸。 。

延伸閱讀: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/