2012-04-07 8 views
11

Tengo una aplicación de ipad/iphone universal que permite al usuario ver un video, y luego puede expandirlo al modo de pantalla completa.¿Cómo me aseguro de que mi vista esté orientada correctamente después de un video de pantalla completa?

He implementado (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration, y en ese método realizo varias llamadas a setFrame en mis elementos de vista dependiendo de si están en orientación horizontal o vertical.

Todo parece funcionar bien en el uso normal, es decir, girar hacia adelante y hacia atrás funciona bien.

Pero si el usuario inicia en modo retrato, inicia un video, pasa al modo de pantalla completa, cambia a orientación horizontal y luego el video se detiene; a menudo los elementos no se redimensionan correctamente. Parecen tener el tamaño todavía como si fueran del modo retrato.

Si, a continuación, paso al modo vertical y luego vuelvo al paisaje, la vista se restablece correctamente.

Lo extraño es que he implementado (void)exitedFullscreen:(NSNotification*)notification y allí imprimo la orientación, y se ve correctamente. También llamo a mi código para restablecer los elementos de vista según la orientación actual, y sigo teniendo este problema.

Otro problema relacionado es a veces cuando se trata de la rotación, mis puntos de vista terminarán demasiado arriba en la pantalla, yendo realmente debajo de la barra de estado en la parte superior del dispositivo.

Editar Aquí está el último ejemplo. Giro al modo horizontal durante la reproducción de video a pantalla completa y luego, cuando salgo de la pantalla completa, puede ver el problema con la barra de navegación en la parte superior de la vista.

Navigation bar goes underneath status bar after rotation during full screen video.

Respuesta

1

Es posible que su ViewController no esté girando porque otro controlador es el primero en responder. Lo que puede hacer para evitar esto es registrar el controlador de vista en los cambios de rotación del dispositivo e implementar la rotación en el selector al que llama cuando recibe dicha notificación.

En AppDelegate:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

En el controlador de vista

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

En rotó puede comprobar la orientación con

[[UIDevice currentDevice] orientation] 
+0

Esto ha ayudado con problemas de rotación mientras mi video se reproduce en línea, pero todavía tengo problemas de experiencia cuando el video se muestra en pantalla completa, gira y sale de la pantalla completa. Vea mi última edición con la captura de pantalla adjunta para ver un ejemplo del problema. –

+0

Voy a otorgarle la respuesta/recompensa porque parece que desde que hice los cambios, definitivamente los problemas de orientación han mejorado. Creo que mi único problema restante tiene que ver con la barra de navegación que se encuentra debajo de la barra de estado después de salir de la pantalla completa, que puede ser un problema completamente diferente. –

0

Mason, ¿se ha identificado y comprobado si su willAnimateRotationToInterfaceOrientation método: duración: se vuelve a llamar después de cada transición de estado?

+0

Sí que se consiga llamar. Como puede ver en mi pregunta, las cosas funcionan principalmente, en términos de rotación. En su mayoría, parece tener problemas cuando la rotación ocurre durante la reproducción de la película. A veces, incluso cuando no está en pantalla completa. –

+0

Así que dices que se llama a tu método incluso antes de que aparezca el problema, pero debido a que el método recupera el valor de orientación incorrecto "... las diversas llamadas de setFrame a tus vistas" son engañadas por una entrada incorrecta. – buildingKofi

+0

Tengo alguna depuración para registrar la orientación que se informa, y ​​ese nunca parece ser el problema. La orientación siempre se informa correctamente cuando me notifican una rotación. –

0

Su orientación puede no actualizarse correctamente si hay otro controlador que actúa como primera respuesta. La mejor manera de superar esto es llamar a las funciones que se utiliza para orientar la pantalla en el método viewWillAppear: utilizando la orientación actual del controlador de vista: [self interfaceOrientation]

Si utiliza una subvista subclase es posible que tenga que volver a implementar las layoutSubviews Methot y call setNeedsLayout. Otra cosa que puede estar causando esto es renunciar al controlador de visualización donde tienes el video como primer respondedor (mays busca si en algún lugar usas el methon resignfirstresponder y prueba cómo funciona sin él). Si esto no funciona, no sé, esto puede ser muy complicado y depende de cómo lo haya implementado. Pero para las cosas que dice que hace, no debería necesitar mucho código, ya que el inspector de tamaños del editor de vistas ahora se ocupa de la rotación y el cambio de tamaño automáticos de las vistas.

Creo que esto debería hacer.

+0

Ya llamo al código para ajustar mis elementos (el mismo código que se llama durante los cambios de orientación) después de salir de la pantalla completa. Entonces no creo que sea eso, pero gracias por la respuesta. –

+0

Edité la respuesta con más consejos, si esto no funciona, no sé. Pero como dije al final, el editor de vistas maneja el cambio de tamaño automático y no necesita mucho código para cambiar el tamaño de una vista de video, simplemente configurando adecuadamente la vista en el inspector de tamaños que debería hacer. –

0

Para mí esta última pantalla no se ve como un problema de cambio de orientación. La barra de navegación está básicamente desactivada por la altura de la barra de estado.

Posiblemente el cálculo de su posición falla porque está utilizando el marco de la vista mientras se reproduce el video a pantalla completa (sin barra de estado) y esto falla tan pronto como la barra de estado vuelve?

+0

Gracias por la respuesta. Probé tu teoría sobre el problema del tiempo con algunos puntos de interrupción. El código para ajustar los cálculos de posición definitivamente está sucediendo DESPUÉS de que tenga el modo de video a pantalla completa. –

1

La barra de navegación en la parte superior de la vista. Lo resolví, usando este código ->

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; 
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; 

Usando esto después de su rotación.

+0

Gracias por la respuesta. Intenté usar este código después de mi rotación, después de la sección de código donde estoy posicionando mis elementos en la vista para la nueva orientación, y no pareció tener ningún efecto. –

Cuestiones relacionadas