Désactiver l'animation de rotation de changement d'orientation

Je dois désactiver l'animation qui joue quand l'orientation change. Est-ce possible? Sinon, est-il possible de l'accélérer?

Juste pour clarifier, je ne veux pas arrêter le changement d'orientation, juste l'animation. Je veux un changement d'orientation instantané.

Si je me souviens bien (c'est toujours le genre de chose avec willRotateToInterfaceOrientation:duration: je dois jouer un moment) willRotateToInterfaceOrientation:duration: et willAnimateRotationToInterfaceOrientation:duration: sont toutes deux dans le bloc d'animation, alors que didRotateFromInterfaceOrientation: s'exécute après le bloc d'animation. Je crois que vous auriez besoin d'exposer vos opinions dans willRotate afin qu'elles apparaissent dans la position dans laquelle elles apparaîtraient après la rotation si elles n'avaient pas tourné (si cela a du sens). De cette façon, l'animation les animera de leur layout originale (correcte) vers la nouvelle layout (pivotée) dans la direction opposée à la rotation de l'appareil, créant ainsi l'apparence d'aucune animation. Une fois la rotation terminée, vous pouvez disposer vos vues, sans animation, dans didRotate , donnant l'printing qu'elles tournent instantanément.

Clair comme de la boue, non?

Oui, il est possible de désactiver l'animation, sans tout casser.

Les codes suivants désactiveront l'animation de rotation de la "boîte noire", sans jouer avec d'autres animations ou code d'orientation:

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [UIView setAnimationsEnabled:YES]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { [UIView setAnimationsEnabled:NO]; /* Your original orientation booleans*/ return TRUE; } 

Placez-le dans votre UIViewController et tout devrait bien se passer. La même méthode peut être appliquée à toute animation indésirable dans iOS.

Bonne chance avec votre projet.


Pour 2016, il semble que shouldAutorotateToInterfaceOrientation ne soit pas disponible pour être remplacé. Ce qui suit semble fonctionner et ne causer aucun autre mal.

 // these DO SEEM TO WORK, 2016 override func willRotateToInterfaceOrientation( toInterfaceOrientation:UIInterfaceOrientation, duration:NSTimeInterval) { UIView.setAnimationsEnabled(false) super.willRotateToInterfaceOrientation(toInterfaceOrientation,duration:duration) } override func didRotateFromInterfaceOrientation( fromInterfaceOrientation:UIInterfaceOrientation) { super.didRotateFromInterfaceOrientation(fromInterfaceOrientation) UIView.setAnimationsEnabled(true) } 

Toutefois!! En effet, ces deux fonctions sont déconseillées. viewWillTransitionToSize prend désormais en charge à la fois "l'avant" et "l'après".

 override func viewWillTransitionToSize(size:CGSize, withTransitionCoordinator coordinator:UIViewControllerTransitionCoordinator) { coordinator.animateAlongsideTransition(nil, completion: {_ in UIView.setAnimationsEnabled(true) }) UIView.setAnimationsEnabled(false) super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator); } 

Dans iOS8, vous pouvez désactiver les animations de rotation en désactivant les animations CALayer dans l'implémentation de viewWillTransitionToSize de votre controller de viewWillTransitionToSize .

La rotation inverse mentionnée dans la réponse acceptée est utile si vous souhaitez personnaliser la transition (voir WWDC 2014 'Afficher les avancements du controller dans iOS 8'), mais pas si vous souhaitez simplement empêcher l'animation.

(NB L'implémentation de viewWillTransitionToSize empêchera l'appel des API de rotation pré-iOS8 obsolètes.)

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [CATransaction begin]; [CATransaction setDisableActions:YES]; [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { // You could make a call to update constraints based on the // new orientation here. } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { [CATransaction commit]; }]; } 

Basé sur la réponse de Nils Munch, voici la version de Swift 3:

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animate(alongsideTransition: nil) { (_) in UIView.setAnimationsEnabled(true) } UIView.setAnimationsEnabled(false) super.viewWillTransition(to: size, with: coordinator) } 

Si vous repositionnez vos vues lorsque la vue est sur le point d'être pivotée, je pense que quand elle tourne vraiment, elle n'aura pas d'animations. Je veux dire, écrire une méthode avec les nouvelles coordonnées, les frameworks, les positions pour chaque sous-vue et appeler cette méthode dans willRotateToInterfaceOrientation:duration: ou willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: (Ce n'est pas une façon intelligente de faire les choses. pas d'animation?)