Las animaciones de UIViewController esperan hasta completar la animation.

Estoy usando este observador: UIDeviceOrientationDidChangeNotification para detectar cuándo el usuario está cambiando la orientación del dispositivo. Cuando la orientación cambió a paisaje, presento un nuevo UIViewController o UIViewController este UIViewController cuando lo cambia de nuevo a retrato.

Mi problema comienza cuando el usuario comienza a girar el dispositivo varias veces y rápidamente, luego la aplicación se vuelve loca hasta que aparece este error:

Advertencia: ¡Intente presentar en qué vista no está en la jerarquía de windows! `.

¿Cuál es la mejor manera de esperar hasta que la animation termine y luego cambiar la rotation?

Esto es lo que estoy usando en el controller de vista Presenting :

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self beginDeviceOrientationListener]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)beginDeviceOrientationListener { [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]]; } - (void)orientationChanged:(NSNotification *)notification { UIDevice *device = notification.object; switch (device.orientation) { case UIDeviceOrientationLandscapeLeft: case UIDeviceOrientationLandscapeRight: { TheViewControllerToPresent *viewController = [[TheViewControllerToPresent alloc] init]; [self presentViewController:viewController animated:YES completion:nil]; [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationLandscapeRight] forKey:@"orientation"]; [[UIApplication shanetworkingApplication] setStatusBarOrientation:[[[UIDevice currentDevice] valueForKey:@"orientation"] integerValue] animated:YES]; [[UIApplication shanetworkingApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; } break; default: break; } } 

Esto es lo que estoy usando en el controller de vista Presentado :

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self beginDeviceOrientationListener]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)beginDeviceOrientationListener { [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]]; } - (void)orientationChanged:(NSNotification *)notification { UIDevice *device = notification.object; switch (device.orientation) { case UIDeviceOrientationPortrait: { [self dismissViewControllerAnimated:YES completion:nil]; [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"]; [[UIApplication shanetworkingApplication] setStatusBarOrientation:[[[UIDevice currentDevice] valueForKey:@"orientation"] integerValue] animated:YES]; } break; default: break; } } 

¡Gracias por adelantado!

La solución más simple que estoy usando es impedir que el usuario realice cambios mientras la animation está en progreso.

Esto se hace agregando el siguiente código cuando se inicia la animation:

 [[UIApplication shanetworkingApplication] beginIgnoringInteractionEvents]; [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 

y al manejador de finalización:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[UIApplication shanetworkingApplication] endIgnoringInteractionEvents]; 

El usuario puede rotar el dispositivo, pero los events no se generarán durante la animation, por lo que las animaciones no chocarán. Sin embargo, cuando finaliza la animation, debe verificar explícitamente la orientación:

 UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

para ver si debes comenzar otra animation o no.