La reproducción automática infringe la animation de la rotation de la traducción

Tengo UIView, quiero animarlo con rotation. Quiero usar autolayout también. Ya vi muchas preguntas frecuentes sobre stackoverflow, pero no encontré ninguna solución aplicable. Entonces, comencemos con mi interfaz y código de animation; Tengo una UIView con image, que debe rotarse. Y en este momento tengo el button, que activa la rotation. En la captura de pantalla puede ver la cruz roja, este debe ser el centro de rotation (ahora está en la image, pero quiero hacer el centro de rotation fuera de la UIView girada, sé que esto podría archivarse con AnchorPoint).

introduzca la descripción de la imagen aquí

Este es mi código de animation de rotation:

#define ROTATE_DURATION 3.0 - (IBAction)rotateArrow { CGAffineTransform transform = self.hand.transform; NSLog(@"layer possition before animation x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); [UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ self.hand.transform = CGAffineTransformRotate(transform, 2*M_PI/3) ; [self.hand layoutIfNeeded]; NSLog(@"layer possition after animation 1 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); } completion:^(BOOL finished) { [UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ self.hand.transform = CGAffineTransformRotate(transform, -2*M_PI/3) ; [self.hand layoutIfNeeded]; NSLog(@"layer possition after animation 2 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); } completion:^(BOOL finished) { [UIView animateWithDuration:ROTATE_DURATION/3 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{ self.hand.transform = CGAffineTransformRotate(transform, 0) ; [self.hand layoutIfNeeded]; NSLog(@"layer possition after animation 3 x: %f; y: %f",self.hand.layer.position.x,self.hand.layer.position.y); } completion:^(BOOL finished) { }]; }]; }]; } 

Entonces, ¿cuál es el problema? Cuando la rotation está en curso, UIView cambia su propiedad center y layer.position , es por eso que mi UIView es "salta" cuando está animada. Si la reproducción automática está desactivada, la animation está bien. Miré WWDC 2012 "Diseño automático por ejemplo" y encontré que es lo que utilizaría [self.hand layoutIfNeeded]; todo estará bien, pero no lo es en absoluto. La animation se volvió un poco más suave, pero veo que esto "salta". Entonces, aquí está mi "salida".

introduzca la descripción de la imagen aquí

Cuando está animando, UIView va a la derecha como puede ver en la image, y que retrocede a la position normal. ¿Cómo puedo solucionar este "saltos"?

Aquí hay un logging:

  layer possition before animation x: 160.000000; y: 99.500000 layer possition after animation 1 x: 197.349030; y: 114.309601 layer possition after animation 2 x: 197.349030; y: 114.309601 layer possition after animation 3 x: 160.000000; y: 99.500000 

Gracias.

Cuando diseñé mis vistas, todo comenzó a funcionar bien. Cuando realiza una transformación, es importante recordar que la reproducción automática siempre calcula los límites y el marco de las vistas, según las restricciones que establezca. Entonces, en mi caso, agregué la alignment, el ancho y la altura vertical y horizontal del centro a mi vista girada, por lo que el mecanismo de reproducción automática sabe cuándo es exactamente mi vista. Y todo va bien. Aquí hay un buen tutorial automático:

http://www.raywenderlich.com/50319/beginning-auto-layout-tutorial-in-ios-7-part-1

Puede encontrarse con la incompatibilidad general entre la reproducción automática y las transformaciones . Echa un vistazo allí para get más detalles, pero la historia corta es que probablemente no quieras usar la reproducción automática en la misma vista que se está transformando.

  1. La solución es crear una vista de contenedor que utilice layout automático.
  2. La vista de rotation (que tiene la transformación aplicada a ella) debería usar el cambio de tamaño automático.
  3. Agregue la vista rotar a la vista del contenedor.

Crea las vistas:

 // Create container view { self.mContainerView = [[UIView alloc] init]; self.mContainerView.translatesAutoresizingMaskIntoConstraints = NO; } // Create view who will have the transform { self.mRotateView = [UIButton buttonWithType:UIButtonTypeCustom]; self.mRotateView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.mContainerView addSubview:self.mRotateView]; } 

Manejar la transformación:

 { CGFloat lAngle = 180.0; [UIView animateWithDuration:0.5 delay:0.0 options: UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveLinear animations:^{ CGAffineTransform transform = CGAffineTransformMakeRotation(lAngle); self.mRotateView.transform = transform; } completion:NULL]; }