licencia kits developer desarrollo desarrollador cuenta certificacion apple iphone ios xcode ipad

iphone - kits - licencia de desarrollo ios



CGAffineTransformMakeRotation en el sentido contrario a las agujas del reloj (2)

La técnica que he usado es dividir el ángulo de rotación entre 2 y separar la rotación en dos animaciones separadas, unidas por el parámetro de animateWithDuration:delay:options:animations:completion: Pero, dado que la vista se ha girado a su posición actual, debe comenzar con esa posición y "anular el giro" de nuevo a cero, frente a intentar rotar CCW desde cero.

UIImageView animar un UIImageView para girar en sentido antihorario cuando un usuario lo toca y mueve su dedo en sentido horario.
Básicamente quiero que el UIImageView regrese a su posición original una vez que el toque finalice y se mueva en sentido antihorario.

El problema que tengo es que cada vez que el ángulo (en grados) es mayor que 180, la imagen gira hacia la derecha hasta su posición original. Al parecer, está tomando el camino más corto de vuelta. En cuanto a los ángulos de 179 grados o menos, la imagen gira en sentido antihorario (lo que necesito).

Intenté ambas piezas de código y se comportan de la misma manera. ¿Alguna sugerencia?

NOTA: aquí la variable de ángulo es un doble y su inicialización es cero y sigue siendo 0 a lo largo de 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); }]; }

Intenté investigar esta publicación y hay un par de problemas con ella

  • Ya no puedo tocar ni rotar la imagen una vez que la animación está lista
  • Siempre se anima en el sentido de las agujas del reloj y no he podido descifrar cómo hacerlo suavemente en el sentido de las agujas del reloj desde el punto donde el usuario terminó de girar la imagen.

Tuve un problema similar, verifique la respuesta aceptada, podría ayudarlo:

Gire un UIView en el sentido de las agujas del reloj para un ángulo superior 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 rotación siempre será en sentido antihorario si el valor de to es menor que el valor de fromValue. No importa si tus valores son positivos o negativos, solo la relación entre ellos.

Averigua cuál es tu ángulo inicial, imagina qué dirección quieres girar y determina cuál es tu ángulo final. Asegúrate de que sea menor que tu ángulo de inicio si quieres ir en sentido contrario a las agujas del reloj. Aquí está el código que uso para animar una manecilla de reloj en el sentido de las agujas del reloj desde las 12:00 hasta 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"]; }