2010-10-01 3 views
2

J'ai une image dans une vue qui contient une grille 9x9. Je veux déplacer l'objet le long de la grille, qui est composée d'un tableau de colonnes (9) à l'intérieur d'un autre tableau (9), en utilisant un mouvement de panoramique. L'image doit se déplacer de carré à carré dans la grille. Le code ci-dessous est ce que j'ai jusqu'ici. Le problème est que l'image saute de 3 à 4 carrés à la fois. C'est beaucoup trop sensible. Quelqu'un peut-il nous éclairer sur le pourquoi et faire des suggestions sur ce qu'il faut faire pour résoudre ce problème de sensibilité?iPhone: Panoramique pour déplacer une image à l'aide de touchesBegan, touchesMoved et touchEnded

Code qui fonctionne:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    gestureStartPoint = [touch locationInView:self.view]; 

    // Do not move if touch is off the grid 
    if (gestureStartPoint.x < 0 || 
     gestureStartPoint.x > 450 || 
     gestureStartPoint.y < 0 || 
     gestureStartPoint.y > 450) { 
     canMove = NO; 
    }else { 
     canMove = YES; 
    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPosition = [touch locationInView:self.view]; 

    double thresholdX = 50; 

    if (canMove) { 
     deltaX = (int)(currentPosition.x - gestureStartPoint.x); 
     if (deltaX > thresholdX) { 
      deltaX = 0; 
      if([self blockCanMoveXDir:1]){ 
       [cBlock movX:1]; 
      } 
      // Resets start point 
      gestureStartPoint = currentPosition; 
      NSLog(@"-------------> Block Moved"); 
     } else if(deltaX < 0 && fabs(deltaX) > thresholdX) { 
      deltaX = 0; 
      if([self blockCanMoveXDir:-1]){ 
       [cBlock movX:-1]; 
      } 
      gestureStartPoint = currentPosition; 
     } 
    } 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    canMove = NO; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    canMove = NO; 
} 

Répondre

1

Je pense que ci-dessous la if (canMove) { vous devez accumuler les mouvements. Permettez-moi explaing, vous devez calculer la deltaX absolue du mouvement de cette manière:

deltaX = currentPosition.x - gestureStartPoint.x; 

où deltaX est une variable de classe. Lorsque cette valeur est supérieure à un seuil, vous effectuerez un mouvement d'un seul bloc. En ajustant ce seuil, vous pouvez changer la sensibilité. Bien sûr, vous devez également prendre en compte le composant Y.

+0

J'ai essayé cela et ça bouge beaucoup trop vite. Je crois que touchesMoved est appelé trop souvent. –

+0

Ce n'est pas une question de fréquence à laquelle TouchMoved est appelé. C'est seulement une question de seuil, essayez ceci: if (canMove) { deltaX = (int) (currentPosition.x - gestureStartPoint.x); si (deltaX> thresholdX) { deltaX = 0; // TODO: Déplacer un bloc // Réinitialise le point de départ gestureStartPoint = currentPosition; NSLog (@ "-------------> Bloc déplacé"); } ... VOTRE CODE ... – MaxFish

+0

Ceci est extrêmement proche. Je pense que je l'ai d'ici. Merci beaucoup. –

Questions connexes