2010-12-16 40 views

回答

16

是的,使用UILongPressGestureRecognizer(在iPhone OS 3.2+上)實現它是相當容易的。長按將由手勢識別器處理,並且短按會通過按鈕的正常動作。

例如,我子類的UIButton和增加了以下方法用於確定長觸摸動作到具有抽頭走(longPressGestureRecognizer是一個實例變量):

- (void)setLongTouchAction:(SEL)newValue 
{ 
    if (newValue == NULL) 
    { 
     [self removeGestureRecognizer:longPressGestureRecognizer]; 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 
    } 
    else 
    { 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 

     longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:[[self allTargets] anyObject] action:newValue]; 
     [self addGestureRecognizer:longPressGestureRecognizer]; 
    } 
} 

我然後可以執行以下操作來設定這兩個短擊長按壓動作將由同一目標進行處理:

[undoButton addTarget:self action:@selector(performUndo:) forControlEvents:UIControlEventTouchUpInside]; 
[undoButton setLongTouchAction:@selector(showUndoOptions:)]; 

正如你所看到的,這是你在許多iPad的應用程序標題欄看到撤銷按鈕有用。

+0

我可以在cocos2d或Box2D的遊戲中使用longPressGestureRecognizer。在我的遊戲中,我需要根據屏幕上的觸摸持續時間來改變玩家跳躍?或者還有什麼是我的解決方案? – Nitish 2011-04-27 12:27:35

4

我能想到的最好的解決方案是創建另一個類和子類UIButton。然後在Interface Builder上(如果這是你使用的),你可以將按鈕的類設置爲你剛創建的自定義類。

因此,在這個新的類,你必須覆蓋一個名爲

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

這基本上是告訴你,有人按下此按鈕的方法。觸摸是一個NSSet,它包含了在屏幕上按下的所有手指的所有信息。如果你只有感興趣的是最爲緊迫的按鈕本身的一個,你可能會碰到這樣的:

NSSet *myTouches = [event touchesForView:self.view]; 

所以,現在你有符合您的按鈕,潤色,你必須找出多少用戶點擊該按鈕的次數。你可以這樣做:

NSUInteger numTaps = [[myTouches anyObject] tapCount]; 

如果這個數字是2,這意味着用戶只是雙擊你的按鈕。接下來的部分。你怎麼知道用戶是否拿着那個按鈕?那麼當用戶放開屏幕時,就會調用另一個方法。您還需要覆蓋該項:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

這是您知道該人是否已停止觸摸屏幕或手指仍在其上的位置。如果他的手指仍然在上面,那麼這個事件還沒有被調用。

現在足以與背景

這是我給你的建議。我建議你重寫touchesBegan:方法,並檢查按鈕中的水龍頭數是否爲2.如果是,則啓動一個計時器,根據需要執行該操作,只要您需要完成,然後在touchesEnded:方法中,您將繼續並停止該計時器,這樣,只要您需要執行此操作,或者只要用戶持續執行,您就可以完成您需要執行的任何操作到按鈕。

我希望這有幫助,顯然我沒有爲你編寫整個代碼,你必須對這些東西進行實驗和研究,但是如果你有任何問題,我會很樂意伸出援助之手: )

8

布拉德拉森的回答看起來不錯,但這裏有另一個可能會給你更多的靈活性/控制你想要或可能想做的事情。

你繼承的UIButton,你重寫的touchesBegan和touchesEnded方法,以便當用戶開始觸摸你打電話

[self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0]; 

,並在touchesEnded你撥打:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil]; 

取消事件如果手指擡得太快。

你可以得到這個完整的代碼在這篇博客文章:

http://www.isignmeout.com/adding-long-tap-functionality-uibutton/

+0

此外,這是針對那些針對早於3.2的iPhone OS版本的人的唯一方法。在此之前,我使用的手勢識別器在操作系統中並不存在。 – 2010-12-17 04:05:11