objective-c uiview rotation trigonometry

objective c - obtener la dirección de rotación de UIView en touchesMoved



objective-c rotation (2)

si el punto central de su perilla es el centro de la imagen que está usando para su perilla, entonces debería poder detectar si el toque comienza a la izquierda / derecha del centro y se mueve hacia arriba / abajo. Si el toque comienza a la izquierda y se mueve hacia abajo, se gira hacia la izquierda. viceversa para toques que comienzan en el otro lado del centro. puede detectar si los toques se mueven hacia arriba o hacia abajo colocando sucesivas x coordenadas en una matriz dentro del método touchesDidMove y haciendo una comparación simple.

esto puede sonar gracioso, pero pasé horas tratando de recrear una perilla con una rotación realista utilizando UIView y algunos trigonométricos. Logré el objetivo, pero ahora no puedo entender cómo saber si el mando gira hacia la izquierda o hacia la derecha. La parte más pertinente de las matemáticas está aquí:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint pt = [touch locationInView:self]; float dx = pt.x - iv.center.x; float dy = pt.y - iv.center.y; float ang = atan2(dy,dx); //do the rotation if (deltaAngle == 0.0) { deltaAngle = ang; initialTransform = iv.transform; }else { float angleDif = deltaAngle - ang; CGAffineTransform newTrans = CGAffineTransformRotate(initialTransform, -angleDif); iv.transform = newTrans; currentValue = [self goodDegrees:radiansToDegrees(angleDif)]; } }

idealmente, podría aprovechar un valor numérico para decirme si la rotación es positiva o negativa.


Gracias Remover. Esto está cerca de lo que necesitaba, pero al final, como el objeto knob pasa un evento a una clase de controlador, necesitaba una forma de medir el valor de la rotación ... es decir: 340 * es 94% en CClockWise. De todos modos, terminé resolviendo esto usando el método anterior y pasando el valor actual a un delegado. El delegado tomaría ese método y con su propio flotante privado, compara si el valor es mayor o menor que el último valor recibido:

// delegate usa un valor privado para medir desde la última llamada #pragma mark UIKnobViewDelegate - (void) dialValue: (float) value {if (lastValue == 0.00) {lastValue = lastValue; } if (valor

a partir de ahí, nuestro controlador puede hacer lo que quiera