La animation de CGAffineTransform en iOS8 es diferente a la de iOS7.

Estoy tratando de encontrar una razón por la cual la animation de la propiedad de transformación UIView ve diferente en iOS 8 que iOS 6/7.

Para un ejemplo simple, antes de iOS 8:

 myView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, 1.57); [UIView animateWithDuration:5 animations:^{ myView.transform = CGAffineTransformTranslate(plane.transform, 100, 0); }]; 

da el resultado esperado, "myView" gira 90 grados y se mueve hacia abajo, pero en iOS8 cuando la animation está animada, comienza en un punto en el que no pude encontrar una explicación (que rompe la animation).

¿Alguien sabe la explicación? ¡Gracias por adelantado!

CGAffineTransformIdentity se comporta de manera diferente en ios7 e ios8. Esto tiene que ver con el layout automático y las classs de tamaño. La solución es eliminar las restricciones que entran en conflicto con la animation en ios7.

 // solve the constraint-animation problem if(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) { // iOS7 remove constraints that conflict with animation if (self.centerYAlignment != nil) { self.view.removeConstraint(self.centerYAlignment) //is an IBOutlet } } else { // iOS8 constraint animations are fine } 

Creo que la razón es solo error iOS8, pero uso CAAnimation en su lugar, y funciona como se esperaba en iOS8.

También tuve problemas con la transformación de la rotation entrecortada en iOS7. Resuelto esto anidando mi vista girada dentro de un contenedor y centrando la vista girada en el interior.

También estoy experimentando el mismo problema con la escala. Supongo que podría ser lo mismo con la rotation. ¿Podrías probar esto?

 myView.transform = CGAffineTransformConcat(myView.transform , CGAffineTransformMakeRotate(1.57)); [UIView animateWithDuration:5 animations:^{ myView.transform = CGAffineTransformTranslate(plane.transform, 100, 0); }]; 

Quizás también sea necesario usar CGAffineTransformMakeTranslate y CGAffineTransformConcat que también, no estoy seguro.

La peor parte de esto es: Tendrías que hacer si / de lo contrario en las versiones de iOS, porque esto se vería extraño en iOS 7. Espero que Apple haya solucionado esto antes o con iOS 8.

Estoy de acuerdo con Pbk en que tiene que ver con las classs de tamaño en io8. Se debe cambiar el tamaño de uiviewcontrollers con uitraitcollections dependiendo de la orientación del dispositivo. De lo contrario, obtienes un uiviewcontroller en modo vertical, mientras que el teléfono está en modo horizontal, cuando intentas rotarlo. Entonces, los pasos correctos son rotar Y anular uitraitcollections

Esto no está completamente relacionado, pero estaba luchando con CGAffineTransformScale no funciona en iOS7 en una animation bastante complicada. Resulta que mi problema era que iOS7 no puede calcular CGAffineTransformScale con CGAffineTransformRotate al mismo time. En iOS7, la última llamada de animation que haces es la única que se anima, por lo que solo se producía la rotation. Este error se solucionó en iOS8.

Mi solución es simplificar mi animation para iOS7, solo encender las cosas elegantes en iOS8:

 //Pre-animation setup: CGFloat radians = (M_PI/180) * (-15); //Get a human-readable number in degrees self.badgeImage.alpha = 0; //Start the image as invisible self.badgeImage.transform = CGAffineTransformScale(self.badgeImage.transform, 1.5, 1.5); //Start the image as scaled bigger than normal if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) { //See below. We will not be rotating the image in iOS7 self.badgeImage.transform = CGAffineTransformRotate(self.badgeImage.transform, radians); //Rotate the image if iOS8 } //Animation Pieces: //Fade in [UIView animateWithDuration: 0.5 delay:0 options:0 animations:^{ self.badgeImage.alpha = 1.0f; //Return image to opaque } completion:NULL]; //Scale with bounce [UIView animateWithDuration: 1.1 delay:0 usingSpringWithDamping:0.3 //Not as good as Android's bounce interpolator, but I'll take it initialSpringVelocity:-1.0f //A negative velocity here makes the animation appear more like gravity than spring options:0 animations:^{ self.badgeImage.transform = CGAffineTransformScale(self.badgeImage.transform, 0.67, 0.67); //Return image to its original size. These arguments are relative to its current scale. } completion:NULL]; //Rotation if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) { //This second animation call negates the first one on iOS7, so remove it. [UIView animateWithDuration: 0.9 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ self.badgeImage.transform = CGAffineTransformRotate(self.badgeImage.transform, (radians * -1)); //Rotate the image back to its original orientation if iOS8 } completion:NULL]; } 

Por supuesto, aún puedes combinar múltiples efectos en iOS7 si utilizas la function confusa CGAffineTransformMakeScale() . Por ejemplo, en la configuration previa a la animation, puede configurar una rotation Y una escala, luego establecer la llamada CGAffineTransformMakeScale(1,1) para restablecer la image a sus métricas originales (los arguments de MakeScale son específicos, no relativos, incluso más ¡confuso!). Esto no siempre es preferible, como en mi ejemplo anterior, donde "rebotar" la animation también rebotaría la rotation.