Je me demande quelle est la meilleure façon d'implémenter des mouvements de rotation basés sur la rotation dans mon application iPhone.Implémentation de la rotation tactile dans le cacao tactile
J'ai un UIView que je souhaite faire pivoter autour de son centre, lorsque le doigt de l'utilisateur touche la vue et la déplace. Pensez-y comme un cadran qui doit être réglé avec le doigt.
La question fondamentale se résume à:
1) Si je me souviens l'angle initial et transformer quand touchesBegan est appelée, puis chaque fois touchesMoved est appelé appliquer une nouvelle transformation à la vue en fonction de la position actuelle le doigt, par exemple, quelque chose comme:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self]; //current position of touch
if (([touch view] == self)
&& [Utility getDistance:currentPoint toPoint:self.middle] <= ROTATE_RADIUS //middle is centre of view
&& [Utility getDistance:currentPoint toPoint:self.middle] >= MOVE_RADIUS) { //will be rotation gesture
//remember state of view at beginning of touch
CGPoint top = CGPointMake(self.middle.x, 0);
self.initialTouch = currentPoint;
self.initialAngle = angleBetweenLines(self.middle, top, self.middle, currentPoint);
self.initialTransform = self.transform;
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint currentPoint = [touch locationInView:self]; //current position of touch
if (([touch view] == self)
&& [Utility getDistance:currentPoint toPoint:self.middle] <= ROTATE_RADIUS
&& [Utility getDistance:currentPoint toPoint:self.middle] >= MOVE_RADIUS) { //a rotation gesture
//rotate tile
float newAngle = angleBetweenLines(self.middle, CGPointMake(self.middle.x, 0), self.middle, currentPoint); //touch angle
float angleDif = newAngle - self.initialAngle; //work out dif between angle at beginning of touch and now.
CGAffineTransform newTransform = CGAffineTransformRotate(self.initialTransform, angleDif); //create new transform
self.transform = newTransform; //apply transform.
}
OU
2) Si je me souviens simplement de la dernière position connue/angle et faire pivoter la vue en fonction de la différence d'angle entre cela et maintenant, par exemple, :La deuxième option a plus de sens pour moi, mais elle ne donne pas de résultats très agréables (mises à jour jaggy et rotations non lisses). Quel est le meilleur (le cas échéant), en termes de performance?
À la votre!
Alors que les UIGestureRecognizers sont sympa et maniable, ils ont un inconvénient: il faut souvent environ 10 pixels de mouvement jusqu'à ce qu'ils reconnaissent leur geste. J'ai trouvé cela inacceptable dans une application graphique liée à moi, alors je le fais à l'ancienne. Cela devient encore plus délicat si vous voulez reconnaître plusieurs gestes. Savoir dessiner des diagrammes d'état aide beaucoup ... –