Comportement étrange de la rotation de transformation affine sur iOS

Je veux faire une rotation assez simple d'un UIImageView. Fondamentalement, j'ai une image d'une roue dans une image parfaitement carrée et je veux la faire pivoter sous l'animation.

J'ai donc essayé ceci:

- (void)testButtonPressed:(id)sender { NSLog(@"Test button pressed"); CGAffineTransform transform = CGAffineTransformMakeRotation(1.0); [UIView animateWithDuration:10.0 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ dial.transform = transform; // "dial" is a UIImageView } completion: ^(BOOL finished){ }]; } 

Qu'est-ce qui se passe est que, lorsque l'animation commence l'image (c'est environ 300 carrés) saute immédiatement 50-100 pixels et est "pressé" dans un ovale étroit. Après cela, l'animation se passe très bien.

J'ai essayé d'utiliser beginAnimation place et j'ai eu le même comportement.

Je comprends que je ne comprends pas les choses sur l'origine de la rotation (les docs parlent en cercles), mais la compression semble étrange, et le fait que tout se produise à la fois (vs être animé) est étrange.

Des idées?

(Cela fonctionne sur le simulateur iPhone 6.0 de Xcode 4.5.1 Est-ce que c'est peut-être juste une chose de simulateur?)

Mise à jour: j'ai eu l'occasion de travailler un peu plus (je le fais entre deux "vrais" travaux). J'ai créé un nouveau XIB qui n'a jamais eu d'autolayout et la roue était "normale" mais l'arrière-plan était compressé verticalement.

Puis un peu d'inspiration. J'ai remarqué que les vues de l'image étaient marquées "autoresize" dans les dumps NLog. N'a pas vu un moyen de désactiver cela de IB, mais a vu que vous pouvez désactiver "Autoresize Subviews" sur la vue principale. Est-ce que cela et il se comportait parfaitement!

Je pense que certaines des nouvelles fonctionnalités introduites pour autolayout sont le coupable ici. Je ne sais pas, cependant, si j'ai trouvé tous les parameters magiques pour le moment.

Mais … Reste le problème que les parties "transparentes" de mes images soient noires sur l'iPad, même après avoir éteint "Opaque" sur tout.

Mise à jour: J'ai finalement compris que mes images étaient en mode JPG 24 bits plutôt qu'en mode 32 bits. Cela fonctionne sur le simulateur – le noir pur est interprété comme transparent. Mais ça ne marche pas sur l'iPad. L'utilisation d'images 32 bits corrige cela et (avec les "sous-vues autoréglées éteintes pour éliminer les distorsions / traductions impaires) tout va bien sauf … les rotations> 180 ° sont animées en arrière L'animation est" intelligente "et prend le" plus court path " .

Je suppose que je devrai simplement décomposer l'animation en deux étapes.

Pourquoi ne le faites-vous pas avec CABasicAnimation?

 CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationAnimation.toValue = [NSNumber numberWithFloat: -M_PI_2 ]; rotationAnimation.duration = 2.0; rotationAnimation.cumulative = YES; rotationAnimation.repeatCount = 1.0; rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; [imageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];