簡體   English   中英

是否可以區分長按和按下按鈕?

[英]Is it possible to differentiate between a long press and a tap on a button?

我們可以調用不同的行動/代表來回應兩個不同的事件

  1. 點擊UIButton
  2. 在UIButton上點擊並按住

是的,使用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應用程序的標題欄中看到的撤消按鈕很有用。

布拉德拉森的答案看起來很不錯,但這是另一個可能會讓你更靈活/控制你想要或可能想做的事情。

你是UIButton的子類,你重寫了touchesBegan和touchesEnded方法,這樣當用戶開始觸摸時你會調用

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

在觸摸中,你打電話給:

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

如果手指過早抬起則取消該事件。

您可以在此博客文章中獲取完整的代碼:

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

我能想到的最好的解決方案是創建另一個類,並創建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:方法中,你將繼續並停止該計時器,這樣你就可以完成你需要做的任何事情,只要你需要這樣做或者只要用戶堅持下去到按鈕。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM