Arrastre + Rotación usando UIPanGestureRecognizer toque salir de pista

Estoy haciendo algunos cálculos de arrastre y rotation usando UIPanGestureRecognizer. El ángulo de rotation es correcto, y la location de arrastre es casi correcta. El problema es que a medida que avanza el centro del cuadro debe ajustarse de acuerdo con el ángulo y no puedo determinar cómo.

He incluido imágenes de cómo se ve una rotation de 180 pero dónde está el dedo durante la rotation. Simplemente no sé cómo ajustar para que el bloque se quede con el dedo apropiadamente. Y aquí hay un video para aclarar porque es un comportamiento extraño. http://tinypic.com/r/mhx6a1/5

EDITAR: Aquí hay un video del mundo real de lo que debería estar sucediendo. El problema es que en el video del iPad, tu dedo se está moviendo donde en el mundo real tu dedo estaría cementado en un lugar particular en el object que se mueve. La matemática que se necesita es ajustar su location táctil a lo largo del ángulo con una diferencia del centro real. Simplemente no puedo entender las matemáticas. http://tinypic.com/r/4vptnk/5

primer disparo

segundo tiro

tercer tiro

¡Muchas gracias!

- (void)handlePan:(UIPanGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { // set original center so we know where to put it back if we have to. originalCenter = dragView.center; } else if (gesture.state == UIGestureRecognizerStateChanged) { [dragView setCenter:CGPointMake( originalCenter.x + [gesture translationInView:self.view].x , originalCenter.y + [gesture translationInView:self.view].y )]; CGPoint p1 = button.center; CGPoint p2 = dragView.center; float adjacent = p2.x-p1.x; float opposite = p2.y-p1.y; float angle = atan2f(adjacent, opposite); [dragView setTransform:CGAffineTransformMakeRotation(angle*-1)]; } } 

Finalmente resolví este problema y lo hice funcionar perfectamente. Persistencia ¿estoy en lo cierto?

Aquí está el código de la solución con algunos comentarios para explicar los cambios.

 - (void)handlePan:(UIPanGestureRecognizer *)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { // Get the location of the touch in the view we're dragging. CGPoint location = [gesture locationInView:dragView]; // Now to fix the rotation we set a new anchor point to where our finger touched. Remember AnchorPoints are 0.0 - 1.0 so we need to convert from points to that by dividing [dragView.layer setAnchorPoint:CGPointMake(location.x/dragView.frame.size.width, location.y/dragView.frame.size.height)]; } else if (gesture.state == UIGestureRecognizerStateChanged) { // Calculate Our New Angle CGPoint p1 = button.center; CGPoint p2 = dragView.center; float adjacent = p2.x-p1.x; float opposite = p2.y-p1.y; float angle = atan2f(adjacent, opposite); // Get the location of our touch, this time in the context of the superview. CGPoint location = [gesture locationInView:self.view]; // Set the center to that exact point, We don't need complicated original point translations anymore because we have changed the anchor point. [dragView setCenter:CGPointMake(location.x, location.y)]; // Rotate our view by the calculated angle around our new anchor point. [dragView setTransform:CGAffineTransformMakeRotation(angle*-1)]; } } 

Espero que mi mes + lucha y solución ayude a otra persona en el futuro. Happy Coding 🙂

Basado en events táctiles https://github.com/kirbyt/KTOneFingerRotationGestureRecognizer

Me ayudó a resolver un problema similar.