2011-02-15 125 views
17

我有一個UILongPressGestureRecognizer添加到UIButton。當按下UIButton時,按預期突出顯示。但是,當UILongPressGestureRecognizer選擇器被調用時,突出顯示被關閉。UILongPressGestureRecognizer關閉UIButton突出顯示

UILongPressGestureRecognizer *longpressGesture = 
    [[UILongPressGestureRecognizer alloc] initWithTarget:self 
              action:@selector(longPressHandler:)]; 
    longpressGesture.minimumPressDuration = 5; 
    [longpressGesture setDelegate:self]; 
    [self.myUIButton addGestureRecognizer:longpressGesture]; 
    [longpressGesture release]; 

    - (void)longPressHandler:(UILongPressGestureRecognizer *)gestureRecognizer { 
    NSLog(@"longPressHandler"); 
} 

在上面的例子中,選擇器在按住按鈕5秒後被調用。該按鈕在選擇器被調用之前突出顯示,但在選擇器被調用時不會突出顯示,即使我仍在按下按鈕。

任何人都可以解釋爲什麼發生這種情況,以及如何防止它?我希望按鈕在按下時始終保持突出顯示。謝謝。

回答

37

經過進一步研究,我發現這是由於默認行爲的手勢識別器,一旦他們識別出一個手勢,它就會取消等級中的接觸。所以,一旦手勢識別器識別出一個手勢,就會取消對UI按鈕的觸摸,然後該按鈕被忽略,因爲它不再有觸摸事件。

此行爲可以使用cancelsTouchesInView屬性

longpressGesture.cancelsTouchesInView = NO; 

將此設置爲NO將通過給應答鏈通過觸摸而改變。

+0

但它會調用touchUpInside的選擇器。如何防止? – user1010819 2013-11-21 19:35:21

0

這是有點猜測..:我懷疑GestureRecognizer的觸發是在響應鏈中的按鈕位置,這使得它失去焦點。我想不出什麼辦法來防止這種情況,但可能會有一些解決方法:

    在長按處理方法
  • 操縱按鈕繼續呈現按下狀態。這可能是一個非常骯髒的方式來做到這一點。
  • 請勿使用手勢識別器。相反,當按鈕被按下時,立即創建一個定時器,5秒鐘後調用某個選擇器。如果在時間過去之前按鈕被釋放,則簡單地使定時器無效。這應該是一個更「乾淨」的解決方案,但是,如果您決定使用手勢識別器,這將無濟於事。