2012-08-25 40 views
10

我在通過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。

+0

你在視圖層次結構中有'exclusiveTouch = YES'somewhere嗎?這似乎發生在我第一次觸摸是在一個視圖的子視圖與'exclusiveTouch = YES' –

+0

我沒有在代碼中的任何地方設置它,但我使用故事板 - 可能他們已經設置它的地方?有沒有其他可能有類似效果的財產?這個視圖控制器在視圖層次結構中有幾代人的深度,所以它的一個超級視圖可能正在做我不期待的事情。 – rankAmateur

+1

可能是我太遲了,但你有沒有注意到,在每種方法中,超級被調用是相同的:touchesEnded – advantej

回答

11

好吧,我就開始苦心重建我的項目,將在文件中一次一個,我想我知道了......

有問題的看法其中有userInteractionEnabled == YES的子視圖。一旦我將其設置爲NO,我的視圖控制器開始爲每次觸摸獲取touchesBegan/Moved/Ended調用。據推測,第二次觸摸是由子視圖聲明,並沒有讓我的視圖控制器,但我不知道爲什麼這隻會發生在第二次觸摸,而不是第一次。

我還沒有弄清楚cocos2d項目到底發生了什麼,但是可能這是一個不同的問題,因爲沒有子視圖或節點可以做同樣的事情。

+3

是否有可能你的子視圖有multipleTouchEnabled == NO? –

+0

是的,它的確如此,但我仍然不明白爲什麼需要第二次觸摸而不是第一次。 – rankAmateur

+5

你正在調用touchesEnd超級方法在你自己的touchesBegan方法中。你應該叫超級碰觸開始。 (反之亦然touchesMoved) – Toad

相關問題