Desactivar la orientación cambiar la animación de rotación

Necesito desactivar la animación que se reproduce cuando cambia la orientación. es posible? Si no, ¿es posible acelerarlo?

Solo para aclarar, no quiero detener el cambio de orientación, solo la animación. Quiero un cambio de orientación instantáneo.

Si recuerdo correctamente (este es siempre el tipo de cosas con las que tengo que jugar por un momento para hacerlo bien) willRotateToInterfaceOrientation:duration: y willAnimateRotationToInterfaceOrientation:duration: ambas están dentro del bloque de animación, mientras que didRotateFromInterfaceOrientation: ejecuta después del bloque de animación. Creo que tendrías que exponer tus puntos de vista en willRotate para que aparezcan en la posición en la que aparecerían después de la rotación si no hubieran girado (si eso tiene sentido). De esta forma, la animación los animará desde su diseño original (correcto) hasta el nuevo diseño (rotado) en la dirección opuesta a la rotación del dispositivo, creando la apariencia de que no hay animación. Una vez que se completa la rotación, puede diseñar sus vistas, sin animación, en didRotate , dando la impresión de que rotan al instante.

Claro como el barro, ¿no?

Sí, es posible desactivar la animación, sin dividir todo.

Los siguientes códigos desactivarán la animación de rotación “caja negra”, sin interferir con otras animaciones o códigos de orientación:

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

Colóquelo en su UIViewController y todo debería estar bien. El mismo método se puede aplicar a cualquier animación no deseada en iOS.

La mejor de las suertes con tu proyecto.


Para 2016, parece que shouldAutorotateToInterfaceOrientation no está disponible para anularse. Lo siguiente parece funcionar y no causa ningún otro daño.

 // 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) } 

¡¡Sin embargo!! De hecho, ambas funciones están en desuso. viewWillTransitionToSize ahora se encarga de “antes” y “despué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); } 

En iOS8 puede desactivar las animaciones de rotación deshabilitando las animaciones de CALayer en la implementación de viewWillTransitionToSize de su controlador de viewWillTransitionToSize .

La rotación inversa mencionada en la respuesta aceptada es útil si desea personalizar la transición (consulte WWDC 2014 ‘Ver avances del controlador en iOS 8’), pero no si solo desea evitar la animación.

(NB La implementación de viewWillTransitionToSize evitará que se invoquen las API de rotación anteriores a iOS8 en desuso).

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

Basado en la respuesta de Nils Munch, esta es la versión 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 reorganizas tus vistas cuando la vista está a punto de girar, creo que cuando realmente gire no tendrá animaciones. Quiero decir, escriba un método con las nuevas coordenadas, marcos, posiciones para cada subvista y llame a ese método en willRotateToInterfaceOrientation:duration: or willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: (Esta no es una manera inteligente de hacer las cosas. Me pregunto, ¿por qué lo necesita? ¿sin animación?)