2011-05-24 5 views
13

Estoy tratando de detectar cualquier cambio en la orientación del dispositivo para poder actualizar las vistas.Ver notificaciones de rotación: ¿por qué didRotateFromInterfaceOrientation: no se llama?

Quiero actualizar los puntos de vista de si la orientación es vertical u horizontal, por lo que he implementado este método:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations. 
return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

Sé que si quiero actualizar las vistas para mostrar adecuadamente para la orientación actual, tendrá que poner en práctica algunos de los métodos siguientes:

– willRotateToInterfaceOrientation:duration: 
– willAnimateRotationToInterfaceOrientation:duration: 
– didRotateFromInterfaceOrientation: 
– willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: 
– didAnimateFirstHalfOfRotationToInterfaceOrientation: 
– willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration: 

Ahora, el problema es que no entiendo por qué ninguno de estos métodos son despedidos cuando puedo rotar el simulador.

me trataron así esta pieza de código:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

Pero aún nada. Entonces me pregunto, ¿el simulador dispara notificaciones de rotación? En caso afirmativo, ¿qué estoy haciendo mal?

+0

¿Dónde implementó este método? –

+0

Sí simulador enviar notificación de rotación. – Ishu

+0

@Ishu: gracias por la información; @Deepak: si se refiere al método didRotateFromInterfaceOrientation, lo implementé en el archivo .m de mi controlador de vista; si está hablando de [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications], hice esto en viewDidLoad del controlador de vista – singingAtom

Respuesta

5

Resumen rápido, cambiar esta situación:

[window addSubview:viewController.view]; 

a esto:

[window setRootViewController:viewController]; 

Lo siento si me tomé el tiempo de alguien por un error tonto de la mía. Descubrí por qué nunca se llamaría al método – willRotateToInterfaceOrientation:duration:. Algo llamó mi atención sobre el controlador de navegación:

Solo se está llamando al método willRotate del controlador de vista raíz. Lo más probable es que tenga una extraña jerarquía de controladores de visualización.

Encontré estas publicaciones en otro foro y eché un vistazo al delegado de la aplicación. Mi código fue el siguiente:

CGRect bound = [[UIScreen mainScreen] bounds]; 
window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, bound.size.width, bound.size.height)]; 
TestViewController *viewController = [[TestViewController alloc] init]; 
[window addSubview:viewController.view]; 
[viewController release]; 
[self.window makeKeyAndVisible]; 

El problema era que no estaba poniendo cualquier controlador de vista de la ventana, pero estaba añadiendo una vista. Fue un error que hice debido a la prisa por probar algo. Tuve que arreglar el código de esta manera:

CGRect bound = [[UIScreen mainScreen] bounds]; 
window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, bound.size.width, bound.size.height)]; 
TestViewController *viewController = [[TestViewController alloc] init]; 
[window setRootViewController:viewController]; 
[viewController release]; 
[self.window makeKeyAndVisible]; 
52

es necesario agregar la notificación observador algo así como

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

y añadir el método

- (void) didRotate:(NSNotification *)notification 
{ 
     UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

     if (orientation == UIDeviceOrientationLandscapeLeft) 
     { 
     NSLog(@"Landscape Left!"); 
     } 
} 
+4

Gracias, esto es justo lo que necesitaba, parece haber una recomendación general de que [UIApplication sharedApplication].statusBarOrientation es más confiable [que la orientación de UIDevice], por lo que las personas pueden querer usar el primero, ciertamente lo estoy. – JosephH

+0

Tiene razón @JosephH – Alkimake

+0

Tenga en cuenta que en el código anterior, UIDeviceOrientationDidChangeNotification debe ser una constante, no el valor real. Simplemente sucede que el valor de la constante es UIDeviceOrientationDidChangeNotification :-) –

Cuestiones relacionadas