2010-04-28 56 views
8

如果我從第一次觸摸中擡起手指,那麼它會識別下一次觸摸就好。只有當我持續第一次觸摸,然後嘗試用不同的手指同時觸摸不同的區域時。然後它會錯誤地將第二次觸摸註冊爲第一次觸摸。touchesEnded不被稱爲?或隨機被稱爲

更新它是與不被稱爲touchesEnded直到最後觸摸已經結束(它不關心,如果您已經有其他5點觸摸結束了,你終於讓最後一個走之前...它稱它們全部結束,一旦最後一次觸碰結束)

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

UITouch* touch = [touches anyObject]; 

NSString* filename = [listOfStuff objectAtIndex:[touch view].tag]; 

// do something with the filename now 

} 

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

ITouch* touch = [touches anyObject]; 
NSString* buttonPressed = [listOfStuff objectAtIndex:[touch view].tag]; 

// do something with this info now 
} 
+1

我創建了一個簡單的測試項目,似乎touchesEnded在每次解除任何手指時都會被調用... – Vladimir 2010-04-29 08:11:01

+0

Vladimir,你會介意在某處發佈代碼示例,以便我可以看到有什麼不同嗎?無論出於何種原因,我所有的touchesEnded都會在同一時間被調用,而不是實際發生的時間。 – iwasrobbed 2010-04-29 11:33:54

+0

順便說一句,在我的程序中,觸及UIImageViews的滾動視圖內的所有內容都在UIView如果這有什麼區別 – iwasrobbed 2010-04-29 15:55:44

回答

7

無論出於何種原因,只有當觸摸位於滾動視圖內時,touchesEnded纔會被延遲。如果你a)禁用滾動的滾動視圖;或b)不使用滾動視圖,然後touchesEnded立即交付。

我聽說有些人攔截了sendEvent,但對我來說這似乎粗略,我真的不想搞砸響應者鏈,因爲sendEvent處理了很多事件。

還有其他想法嗎?有沒有人有過UIWindow的子類,試圖攔截這種方式?您可以提供的任何輸入值得讚賞。

0

設置multipleTouchEnabled

在Interface Builder中,它是「啓用用戶交互」下的「多點觸控」複選框。

+0

tewha,你可能會在這裏的正確軌道...我在代碼中創建UIImageViews並在設置過程中設置MultipleTouchEnabled。出於某種原因,我不確定它的設置是否正確。我已經在其他地方看過,如果MultipleTouchEnabled沒有設置爲YES,那麼touchesEnded將不會被調用,直到最後一次觸摸結束(這完全匹配我的錯誤!)。 – iwasrobbed 2010-04-30 03:03:15

+0

沒關係,只是檢查,所有已啓用,並確保足夠的可用性multipleTouchEnabled爲YES是:( 它可能與所有的UIImageViews在滾動視圖內有什麼關係嗎?在滾動視圖之外他們做得很好,但在滾動視圖內不會立即發送消息。 – iwasrobbed 2010-04-30 03:28:27

6

scrollview有一個屬性delaysContentTouches默認設置爲YES。它會延遲所有的觸摸事件,直到它確定一個滾動手勢。

4

我知道這個問題有點老,但我想我會分享我的經驗,任何人在這個線程中絆倒尋找答案,就像我剛纔一樣。

我一直在努力解決這個問題幾個小時,唯一能解決的問題就是刪除我使用的任何UIGestureRecognizer對象。

對於我的設置,我使用平移和敲擊識別器來捕捉這些手勢,並使用touchesBegan和touchesEnded進行任何標準觸摸事件。直到我移除UIGestureRecognizer對象時,touchesEnded方法纔開始再次調用第二次觸摸結束。具體來說,這是導致問題的泛認識者。

我不完全確定這是否適用於這種情況,但它解決了我遇到的問題。

9

今天我有這個,(或者更確切地說,我今天把這個問題拋在了我身上!)。

我看到發生的事情:

  • 觸摸屏,手指1起
  • 的touchesBegan火災
  • 觸摸屏,手指2起
  • 的touchesBegan火災
  • 鬆開手指2
  • 什麼也沒有發生
  • 鬆開手指1
  • touchesEnded火災
  • touchesEnded火災

由於加文·克利夫頓說,如果你添加一個手勢識別時纔會發生。如果沒有添加識別器,每次釋放手指後touchesEnded都會觸發。 如果我不需要使用識別器,那將會很棒...... !!!

我解決了這個通過添加gestureRotation.delaysTouchesEnded = FALSE;我識別創建/加入代碼:

gestureRotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRotation_Callback:)]; 

[gestureRotation setDelegate:self]; 
gestureRotation.cancelsTouchesInView = FALSE; 
gestureRotation.delaysTouchesEnded = FALSE;  // <---- this line!! 
[self.view addGestureRecognizer: gestureRotation]; 
[gestureRotation release]; 

現在的姿勢工作,的touchesBegan不再排隊!

0

我剛剛遇到了這個問題,其中一個touchesEnded永遠不會在ScrollView中的按鈕上調用。根據Ovidiu的回答,我發現手動設置ScrollView的ContentOffset導致了問題。假設我設置contentOffset的方式讓ScrollView混淆了我是否試圖按下按鈕或滾動視圖。

讓偏移量保持在0,0使問題消失。

0

我找到了另一個選項。

經過touchesBeganCGPoint未移動根據touchesMoved,touchesCancelled調用。

但是,如果CGPoint更改根據touchesMoved,touchesEnded調用。