2011-02-04 77 views
2

我創建了一個包含兩個UIButton s的小型UIView。該視圖響應UITapGesture事件。按鈕應該會響應TouchUpInside,但是當我點擊按鈕時,響應者是底層視圖,輕擊手勢選擇器被觸發。尋找建議或建議。UIButton觸摸事件落入底層視圖

+0

我已經結束了什麼做的是交易的UIButtons UIViews也有一個附加的輕拍手勢識別器。這似乎按照我期望按鈕的行爲方式工作。 – Kyle 2011-02-07 16:14:06

回答

0

如何在視圖層次結構中排序視圖?另外,你在IB中創建接口嗎?如果你正確連接連接,這應該不是問題...

+0

這就是我所做的。 – Kyle 2011-02-05 19:30:46

0

每個UIView都有一個'exclusiveTouch'屬性。如果它被設置爲YES,則該視圖不會將響應傳遞給響應者鏈。嘗試在你的UIButtons上設置這個屬性,看看這是否有所作爲。

+0

我會給這個鏡頭。 – Kyle 2011-03-04 15:37:02

0

這個設計的問題是,它類似於將一個按鈕嵌入到另一個按鈕。雖然您可能有合理的理由去做,但您應該更加註意事件流程。

在手勢識別器到達子視圖(您的案例中的兩個按鈕)之前,手勢識別器會攔截觸摸。您應該實現UIGestureRecognizerDelegate協議,即gestureRecognizer:shouldReceiveTouch:方法,如果觸摸位於兩個按鈕中的任何一箇中,則返回NO。這將防止橙色視圖篡改旨在用於按鈕的觸摸,並且按鈕將按預期開始工作。

+0

我想到了這一點,但即使動畫(按鈕上的藍色閃光)顯示按鈕響應,對觸摸作出響應的視圖仍是底層視圖。 – Kyle 2011-02-05 19:30:29

3

可以修改響應橙色視圖點擊手勢的方法:

-(void) handleTapFrom:(UITapGestureRecognizer*) recognizer { 
    CGPoint location = [recognizer locationInView:orangeView]; 
    UIView *hitView = [orangeView hitTest:location withEvent:nil]; 

    if ([hitView isKindOfClass:[UIButton class]]) { 
     return; 
    } 

    //code that handle orange view tap 
    ... 
} 

如果觸摸一個UIButton這樣,水龍頭會由基礎視圖被忽略。

1

正確的答案(這可以防止劫持任何水龍頭tabrecognizer和不需要你實現一個委託等)是found here。我通過this post得到了這個答案。

總之使用:

tapRecognizer.cancelsTouchesInView = NO; 

「防止水龍頭識別要抓住所有的 水龍頭只有一個」