CGAffineTransformMakeRotation en sentido antihorario siempre

UIImageView animar un UIImageView para girar en el sentido contrario a las agujas del reloj cuando un usuario lo toca y mueve su dedo en el sentido de las agujas del reloj.
Básicamente, quiero que el UIImageView regrese a su position original una vez que el toque finalice y debería moverse en el sentido contrario a las agujas del reloj.

El problema que tengo es que cada vez que el ángulo (en grados) es mayor que 180, la image gira en el sentido de las agujas del reloj a su position original. Es aparentemente tomando el path más corto atrás. En cuanto a los angularjs de 179 grados o less, la image gira en el sentido contrario a las agujas del reloj (lo que necesito).

Probé ambos códigos y se comportan de la misma manera. ¿Alguna sugerencia?

NOTA: aquí la variable de ángulo es un doble y su initialization es cero y permanece 0 en todo mi código

 -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self handleObject:touches withEvent:event isLast:YES]; /* this doesn't make rotation counter clockwise for rotations greater than 180 */ [UIView beginAnimations:nil context:NULL]; [UIView setAnimationCurve: UIViewAnimationCurveLinear]; [UIView setAnimationDuration:1.0]; [UIView setAnimationRepeatCount:1]; CGAffineTransform transform = CGAffineTransformMakeRotation(angle); circle1ImgVw.transform = CGAffineTransformRotate(transform, angle); // ends animation [UIView commitAnimations]; /* this doesn't make rotation counter clockwise for rotations greater than 180 */ [UIView animateWithDuration:1.0 animations:^{ circle1ImgVw.transform = CGAffineTransformMakeRotation(angle); }]; } 

Traté de search en esta publicación y hay algunos problemas con ella

  • No puedo volver a tocar y girar la image después de que se haya realizado la animation.
  • Siempre se anima en el sentido de las agujas del reloj y no he podido averiguar cómo hacer que vaya en el sentido contrario a las agujas del reloj desde el punto donde el usuario terminó de rotar la image.

Tuve un problema similar, verifica la respuesta aceptada, podría ayudarte:

Gire una UIV en sentido horario para un ángulo mayor a 180 grados


En respuesta a los comentarios, tal vez esto ayude:

En mi código realmente uso

 rotationAnimation.fromValue rotationAnimation.toValue 

en lugar de

 rotationAnimation.byValue. 

La rotation siempre estará en el sentido contrario a las agujas del reloj si el valor de toValue es menor que el valor de valueValue. No importa si tus valores son positivos o negativos, solo la relación entre ellos.

Averigua cuál es tu ángulo inicial, determina en qué dirección quieres girar y descubre cuál es tu ángulo final. Asegúrese de que sea menor que su ángulo de inicio si desea ir en sentido contrario a las agujas del reloj. Aquí está el código que uso para animar un reloj en el sentido de las agujas del reloj de 12:00 a la hora actual.

 -(void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self updateClockArmAngle]; } - (void)updateClockArmAngle { // Get the time NSDate *date = [NSDate date]; NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; [calendar setTimeZone:[NSTimeZone timeZoneWithName:@"America/Toronto"]]; NSDateComponents* components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:date]; CGFloat hour = [components hour]; CGFloat angle = (hour/24.0)*(2*M_PI); CGFloat minute = [components minute]; angle += (minute/(24*60))*(2*M_PI); [self rotateViewAnimated:self.clockArm withDuration:1.5 byAngle:angle]; } - (void) rotateViewAnimated:(UIView*)view withDuration:(CFTimeInterval)duration byAngle:(CGFloat)angle { CABasicAnimation *rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.fromValue = 0; rotationAnimation.toValue = [NSNumber numberWithFloat:angle]; rotationAnimation.duration = duration; rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [rotationAnimation setRemovedOnCompletion:NO]; [rotationAnimation setFillMode:kCAFillModeForwards]; [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; } 

La técnica que he usado es dividir el ángulo de rotation en 2 y separar el giro en dos animaciones separadas, vinculadas por la completion: parámetro de animateWithDuration:delay:options:animations:completion: Pero, dado que la vista se ha girado a su position actual, debe comenzar con esa position y "girar" hacia atrás a cero, en lugar de intentar girar CCW desde cero.