2012-06-22 64 views
1

我有一個簡單的滑動手勢,我想要非常低的優先級。我希望它被視圖上的控件發生的事件取消。起初,我認爲這很簡單。手勢發生時很容易取消事件,但我似乎無法相反。獲取UIEvent取消UIGestureRecognizer

我的解決方案是取消手勢,如果它與任何可觸摸的東西衝突。以下是我一起入侵的代碼:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    CGPoint touch = [gestureRecognizer locationInView:self.view]; 
    return [self.view hitTest:touch withEvent:nil] == self.view; 
} 

我覺得這是對問題的錯誤解決方案。我錯過了什麼?什麼是正確的方式來取消活動取消手勢?


對於更多的上下文,我有兩個UISwipeGestureRecognizers(向左滑動並向右滑動)添加到視圖中。視圖中還有一個UISlider(嵌入式MPVolumeView的一部分)。當我移動滑塊來改變音量時,左側或右側的滑動將會觸發。

回答

2

這是正確的方式來做你想做的。您要告訴手勢識別器,只有當觸摸直接在視圖中時,才應該開始,而不是任何子視圖(根據hitTest:,這是很好的,因爲它允許視圖決定它們是否被擊中)。

防止它開始而不是試圖取消它之後總是會更好。但是,如果想要在開始後取消該手勢,請設置enabled = NO,然後再回到YES

如果您需要允許某些子視圖的手勢但不控制,則可以使用isKindOfClass:測試hitTest:返回的視圖是否爲UIControl(例如)的子類。

我不知道這是什麼類型的手勢,但通常你不需要這樣做,因爲UIKit會自動找到想要觸摸的最深的視圖,並且該視圖將'吃'它們,所以外部手勢識別器不會得到它們 - 但我可以想象這對某些識別器/控件的組合不適用。

+0

在問題中增加了更多細節。 UISlider正在移動時,UISwipeGestureRecognizer正在觸發。 –

+0

Ahh好吧 - 我猜滑塊不會阻止其他地方被觸發。使用手勢識別器的視圖通常會阻止這種情況。在這種情況下,我認爲這種方法是正確的。 – jhabbott