2013-07-31 39 views
0

我有一個連接了四個平移手勢的視圖。第一個觸摸的最大和最小觸點數都設置爲1,第二個觸摸點的數量等於2。這樣,每個觸摸屏只能識別一個觸摸,而最多四個手指在屏幕上滑動。使用手勢識別器,可以動態地堅持一觸之中

這是工作丹迪。什麼是不工作正在檢測個人觸摸結束。當所有手勢完全結束時,只有手勢結束時纔會發生的任何事情都會發生。

實例的委託方法:

- (void) handlePan:(UIPanGestureRecognizer*)recognizer { 

    //Setting what happens when a gesture is recognized as beginning 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 

    //...whatever happens, bunnies follow your finger or whatever 

    } else 

    //Setting what happens when a gesture ends 
    if ((recognizer.state == UIGestureRecognizerStateEnded) | 
     (recognizer.state == UIGestureRecognizerStateCancelled) | 
     (recognizer.state == UIGestureRecognizerStateFailed)) { 

     NSLog(@"end"); 

    } 
} 

什麼應該發生的事情是,我看到的「結束」,在任何時候手指擡起控制檯。相反,在所有手指擡起之前我什麼都看不到,在這一點上,我看到「結束」重複了四次(或者與屏幕上的手指一樣多)。

有沒有什麼辦法可以讓我按照自己的方式工作?

編輯擺弄之後,我發現我可能沒有正確分析我的問題。我想要檢測手勢觸摸何時結束的全部原因是,我希望手勢能夠在屏幕上有多個觸摸時變爲活動狀態,但我希望每個手勢僅跟蹤一個觸摸本身。我在跟蹤觸摸的手勢上設置了一個「活動」標誌,然後在觸摸結束後將該標誌切換掉,但這不起作用,因爲觸摸結束檢測很難實現。

但是,如果有不同的方式來實現同樣的事情,那就是我正在尋找的東西:在許多重疊的觸摸中,每個手勢識別器都跟蹤一個並且只有一個。

+0

我認爲[此帖](http://stackoverflow.com/a/12434281/352891)將幫助 – user352891

+0

@ user352891謝謝你的提示;它實際上涉及不同的事情。它根據手勢在屏幕上的位置進行區分,並且根本不執行任何狀態檢測。 –

回答

0

這是最終的工作。

簡而言之,每當手勢識別器被分配一次觸摸時,我就會翻起一面旗幟,確保沒有其他識別器接受該觸摸。我還測試了每個識別器,以確保它只在觸摸時才接受觸摸。所以我讓每次觸摸只能分配一次,每個識別器只接受一次觸摸。像魅力一樣工作。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
      //set this to no every time a new touch happens, meaning it isn't taken yet. 
      touchTaken = NO; 
     } 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

     //If the touch is taken or the gesture's already following a touch, say no. 
     if (touchTaken | ([gestureRecognizer numberOfTouches] > 0)) { 
      return NO; 
     } 
     else { 
      touchTaken = YES; 
      return YES; 
     } 
    } 
0

你可能想要做一些事情 - 它捕捉給定手勢在屏幕上的手指變化;你可能需要添加更多的邏輯圍繞你正在使用的手勢:

switch(recognizer.numberOfTouches) { 
    case 1: { 
     NSLog(@"1 "); 
     break; 
    } 
    case 2: { 
     NSLog(@"2"); 
     break; 
    } 
    case 3: { 
      NSLog(@"3"); 
      break; 
    } 
    case 4: { 
      NSLog(@"4"); 
      break; 
    } 
    default: { 
      NSLog(@"0"); 
    } 
}