![](/img/trans.png)
[英]in iOS 4.3, how i can differentiate between the background mode, when you press the home button or when you press the on/off button?
[英]Is it possible to differentiate between a long press and a tap on a button?
我們可以調用不同的行動/代表來回應兩個不同的事件
?
是的,使用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.