我在通過UIViewController的touchesBegan/Moved/Ended方法處理多個觸摸時遇到了問題。我也在cocos2d應用程序中看到同樣的行爲(使用ccTouchesBegan/Moved/Ended),所以我認爲這個問題可以應用於iOS中的所有觸摸處理。我已經把我在下面使用的代碼放在了後面,然後是我看到的結果。爲什麼UIViewController touchesBegan,touchesMoved&touchesEnded僅在兩個觸摸的第一個開始,移動或結束時被調用?
所有方法都在UIViewController子類上實現。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches Began");
[self logTouchesFor: event];
[super touchesEnded: touches withEvent: event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches Moved");
[self logTouchesFor: event];
[super touchesEnded: touches withEvent: event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"Touches Ended");
[self logTouchesFor: event];
[super touchesEnded: touches withEvent: event];
}
-(void)logTouchesFor:(UIEvent *)event
{
int count = 1;
for (UITouch *touch in event.allTouches)
{
CGPoint location = [touch locationInView: self.view];
NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y);
count++;
}
}
現在到了有趣的結果...
單倒是按預期
比方說,我觸摸屏與我的拇指。我在輸出窗口中看到touchesBegan已按預期調用。我移動我的拇指並觸摸移動被調用。然後我將拇指從屏幕上擡起,touchesEnded被調用。所有這一切都如預期的那樣,我將其作爲控制案例納入問題 - 只是爲了清楚我的視圖控制器正在接收觸摸事件,並且我沒有錯過任何地方的vc.view.userInteractionEnabled = YES
。
第二觸摸不會導致的touchesBegan,touchesMoved或touchesEnded被稱爲
這是最有趣的。比方說,我用拇指觸摸屏幕(touchesBegan被稱爲)並將其保持在屏幕上。然後我用食指觸摸屏幕上的其他地方,同時將拇指放在同一個地方。 TouchesBegan沒有被調用。然後讓我們說,我保持拇指絕對靜止的同時移動食指(這可能很棘手,但有可能)。 TouchesMoved不被調用。然後,我將食指從屏幕上擡起。 TouchesEnded未被調用。最後,我移動我的拇指和touchesMoved被調用。然後我從屏幕上擡起我的拇指,並調用touchesEnded。
只是要清楚:我已在我的viewDidLoad
方法中設置了self.view.multipleTouchEnabled = YES
。
信息關於第二觸摸是可用的,提供了第一觸摸移動
這次我做的非常相似,立即上面的例子東西。我用拇指觸摸屏幕,然後食指同時保持拇指靜止。 TouchesBegan在我的拇指碰到屏幕時調用,但不是我的食指。現在我移動我的拇指,並touchesMoved被調用。不僅如此,在事件中還有兩個觸動.allTouches數組(是的,第二次觸摸就是我所期望的)。這意味着系統意識到我已經第二次觸摸屏幕,但我沒有通過視圖控制器上的觸摸處理方法得到通知。
如何才能通知第二次觸摸的更改?
我真的很希望能夠對第二次觸摸的位置或狀態發生變化作出響應,而不是在第一次觸摸也發生變化時進行響應。很多時候,這不會成爲一個問題,因爲很難在不影響對方的情況下改變一個接觸,但至少有一種情況可能會成爲問題。我錯過了明顯的東西嗎?有沒有其他人注意到這種行爲或有問題?
如果相關,我使用運行iOS 5.1的iPhone 3GS。
你在視圖層次結構中有'exclusiveTouch = YES'somewhere嗎?這似乎發生在我第一次觸摸是在一個視圖的子視圖與'exclusiveTouch = YES' –
我沒有在代碼中的任何地方設置它,但我使用故事板 - 可能他們已經設置它的地方?有沒有其他可能有類似效果的財產?這個視圖控制器在視圖層次結構中有幾代人的深度,所以它的一個超級視圖可能正在做我不期待的事情。 – rankAmateur
可能是我太遲了,但你有沒有注意到,在每種方法中,超級被調用是相同的:touchesEnded – advantej