CGAffineTransformRotate y M_PI inconsistencias (Objetivo C, iOS)

Estoy intentando hacer rotaciones simples en el Objetivo C y hay un par de problemas de inmediato. Una cosa es la inconsistencia que obtengo de CGAffineTransformRotate y cómo M_PI no es coherente cuando se usa dentro de esa function.

Supongamos que hago esto y adjunto a un button. Cuando lo presiono una vez, girará 180 grados en sentido contrario a las agujas del reloj (bueno y sigue la documentation), pero cuando lo presiono de nuevo, girará 180 en el sentido de las agujas del reloj aunque el valor no sea negativo. Cambiar M_PI a -M_PI hace exactamente lo mismo sin diferencias en la rotation:

[UIView animateWithDuration:secs delay:0.0 options:option animations:^{ self.transform = CGAffineTransformRotate(self.transform, M_PI); //Inconsistent } completion:nil]; 

Ahora supongo que cambié M_PI a 3.141593, que es el valor que M_PI contiene cuando lo imprimo. Ahora, cuando presiono el button, funciona completamente bien. En ambas ocasiones, girará 180 grados en sentido contrario a las agujas del reloj. Cuando lo cambio a -3.141593, también funcionará completamente bien, en el sentido de las agujas del reloj:

 self.transform = CGAffineTransformRotate(self.transform, 3.141593); //Works 

Cuando juego más, el comportamiento se vuelve más extraño.

Supongamos que quiero girar 90 grados (pi / 2). M_PI ahora tiene el mismo comportamiento que usar un valor pero la rotation es opuesta a lo que debería ser:

 //Should be Clockwise but rotates CounterClockwise self.transform = CGAffineTransformRotate(self.transform, -M_PI/2); self.transform = CGAffineTransformRotate(self.transform, -1.5707965); //Should be CounterClockwise but rotates Clockwise self.transform = CGAffineTransformRotate(self.transform, M_PI/2); self.transform = CGAffineTransformRotate(self.transform, 1.5707965); 

Y si quiero rotar algo más de 180 grados (PI), el comportamiento es solo rotar la ruta más corta aunque especifique una rotation positiva o negativa. Cuando giro 360 grados (2PI), ni siquiera gira.

¿Puede alguien decirme por qué suceden estas cosas y puedo hacer para que sea más consistente? Y una segunda pregunta que tengo es cómo puedo rotar las cosas 270 y 360 grados.

Gracias.

El problema es que realmente no puedes controlar la dirección de rotation cuando utilizas animateWithDuration. Siempre tomará la ruta más corta. Al girar 180 grados, el comportamiento es indeterminado porque, en teoría, hay 2 posibilidades para la ruta más corta. Esto también explica por qué no puedes girar más de 180 grados. Si desea tener más control sobre la animation o hacer animaciones más complejas, use una CAKeyframeAnimation.

Como dijo phix23: siempre toma la ruta más corta. Por lo tanto, puede evitarlo utilizando este truco, por ejemplo, para ir en el sentido de las agujas del reloj: debe dividir el círculo en, por ejemplo, 3 puntos de control:

 [UIView animateWithDuration:secs delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ self.transform = CGAffineTransformRotate(self.transform, M_PI_2/3); } completion:(BOOL end) { [UIView [UIView animateWithDuration:secs delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ self.transform = CGAffineTransformRotate(self.transform, -M_PI_2/3); } completion:(BOOL end) { } } ]; 

Este código no se probó, por lo que si hay un problema, intente jugar con él. Espero que esto te ayude.