2012-05-21 13 views
22

Tengo un comportamiento extraño donde mi MPMoviePlayerViewController no es auto -llama cuando cambia orientation. Sin embargo, recreé la misma jerarquía de vistas en un nuevo proyecto y cuando el reproductor MPMoviePlayerViewController estaba activo, rotó a cada orientación. Revisé el proyecto buscando cualquier cosa que pudiera establecer la orientación explícitamente, pero no hay nada.MPMoviePlayerViewController no gira automáticamente

Voy a presentar toda la información relevante aquí y las cosas que he intentado hasta ahora.

La jerarquía de vistas actualmente tiene el siguiente aspecto:

  • Navigation Controller
  • "raíz" Vista Controlador < - del mando de navegación 'RootViewController'
  • "Feed" Vista Controlador < - Empujado en la pila de navegación por la raíz VC
  • "Vista previa" Vista Controlador < - Presentado como un VC modal de la RSS
  • MPMoviePlayerViewController Subclase < - presentado por el VC de alimentación a través de 'presentMoviePlayerViewControllerAnimated'

Cada clase en la jerarquía de vistas responde a shouldAutorotateToInterfaceOrientation con YES solo para UIInterfaceOrientationPortrait.

cosas que he intentado:

  • enviar manualmente el shouldAutorotateToInterfaceOrientation hasta la pila de la "raíz" VC hasta el MPMoviePlayerViewController
  • Anulación de la aplicación de las shouldAutorotateToInterfaceOrientationMPMoviePlayerViewController subclase para volver SÍ para ambas orientaciones del paisaje y SÍ para todas las orientaciones.
  • Configuración de 'Orientación del dispositivo compatible' en la pestaña de resumen del proyecto.
  • Llamando al presentMoviePlayerViewControllerAnimated de otros VCs como el RSS VC

Si el reproductor de películas gira adecuadamente en un proyecto fresco con misma vista de jerarquía, lo que sea posible podría estar recibiendo en el camino aquí. ¿Alguna idea de dónde se puede estancar la orientación?

+5

Una aplicación que utiliza un UINavigationController (o UITabBarController) sólo gira si ** todos los controles view * visualizables (apilados/tabulados) aceptan la rotación. En su caso, asegúrese de que la subclase MPMoviePlayerViewController devuelve 'SÍ' en todos los casos cuando se le pregunta en' shouldAutorotateToInterfaceOrientation'. – Till

+0

@Till Ciertamente lo entiendo, pero como dije: En un proyecto de prueba con la misma jerarquía de vistas, donde todas las vistas coinciden en una rotación (retrato), el reproductor de películas giró a cada orientación sin ningún problema. Editar: La última parte de su respuesta fue respondida en "Cosas que intenté" en mi pregunta. ¡Gracias! – dannyzlo

+1

a la derecha, revise mi comentario editado ya que inicialmente no entendía completamente su jerarquía de UI. – Till

Respuesta

1

Solución:

Para cualquier persona que pudiera encontrarse con esto, la razón por la que el vídeo no estaba rotando era que estaba añadiendo accidentalmente el RootViewController tiene RootViewController de la ventana, en lugar de la UINavigationController.

self.window.rootViewController = navController; 

es correcta

self.window.rootViewController = rootViewController;

no es

Gracias chicos por su ayuda y la entrada en el camino.

3

He encontrado que los objetos MPMoviePlayerViewController respetarán la configuración Info.plist del proyecto para las orientaciones de interfaz admitidas. En un proyecto mío, solo estaba permitiendo vistas de paisaje en ese archivo para que el reproductor de películas no gire, incluso cuando respondió YES a orientaciones de paisaje en shouldAutorotateToInterfaceOrientation:.

Edit: OK, agarrando en pajas: ¿Implementas automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers en cualquiera de tus subclases UIViewController? Si es así, y devuelve NO, sus subclases deben reenviar los métodos apropiados a los controladores secundarios al cambiar la orientación.

De lo contrario, ¿hay alguna manera de ver su código?

+0

Gracias, pero desafortunadamente eso tampoco lo hizo por mí. Intenté configurar el archivo project-info.plist para que aceptara todas las orientaciones, así como solo el paisaje, pero fue en vano. – dannyzlo

0

¿Estás usando guiones gráficos? Compare la configuración de orientación para sus UIViewControllers y su UINavigationController entre su proyecto roto y su proyecto de prueba. La configuración de "Orientación" en el inspector de atributos puede bloquearlo en una orientación.

Usted mencionó shouldAutorotateToInterfaceOrientation: y su plist configuración así que no voy a entrar en eso ...

+0

Gracias por la respuesta, pero no hay guiones gráficos en este proyecto. – dannyzlo

7

voy a sugerir que no utilice presentMoviePlayerViewControllerAnimated, en lugar de agregar como subvista. Creo que solucionará tu problema muy bien.

MPMoviePlayerViewController *mpviewController = [[MPMoviePlayerViewController alloc] 
        initWithContentURL:[NSURL fileURLWithPath:self.filePath]]; 
[self.view addSubview:mpviewController.view]; 
[self setWantsFullScreenLayout:YES]; 

y retire la mpviewController.view cuando MPMoviePlayerPlaybackDidFinishNotification detectado. Déjame ver tu éxito ...

+0

+1 para pensar diferente –

+0

Buena idea, pero esto no funcionó :-(. Más tarde intentaré volver a crear el proyecto de prueba no solo con la jerarquía de vista idéntica sino con las mismas clases que tengo en producción. Lo mantendré actualizado. ¡gracias! – dannyzlo

+0

¡La mejor respuesta! –

2

Sé que esto podría ser una sugerencia estúpida, pero asegúrese de que el método shouldAutorotateToInterfaceOrientation en su subclase MPMoviePlayerViewController se está llamando. Tal vez algo salió mal allí ...

También asegúrese de que usted no tiene 2 subvistas añaden a la principal UIWindow como se especifica here:

Q: ¿Por qué no mi UIViewController girar con el ¿dispositivo?

[...]

  • propiedad UIView del controlador de vista está incrustado dentro UIWindow pero junto a un controlador de vista adicional.

Creo que eso también podría causarle algunos problemas. Puede encontrar más información sobre lo que podría salir mal en el enlace de arriba.

0

hay algunas razones detrás de la consulta ..

*** Está llamando MPMoviePlayerViewController .. así aplicar Orientación automática en "Feed" View Controller Y tratar de llamar por PushViewController ..

*** Use MPMoviePlayerController vez de MPMoviePlayerViewController y añadir a subvista en FeedViewController ..

código de ejemplo para MPMoviePlayerController--

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"filename" ofType:@"type"]]; 
videoPlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
videoPlayer.controlStyle = MPMovieControlStyleNone; 
videoPlayer.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width); 
[videoPlayer prepareToPlay]; 
videoPlayer.view.center = self.view.center; 
videoPlayer.fullscreen = YES; 
[self.view addSubview:videoPlayer.view]; 
[videoPlayer play]; 

*** Compruebe la fijación de objetivos de Xcode y aplicar la orientación permitir que todos los ..

+0

Y si estás usando MPMoviePlayerController en viewDidLoad, que intentas usar en viewWillAppear ... –

0

Debe probar este (trabajó para mí):

Declare en el archivo .h:

BOOL landscape; 

. m archivo:

-(IBAction)PlayMovie:(NSString *)movieName { 
    landscape = YES; 
    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *moviePath = [bundle pathForResource:movieName ofType:@"mp4"]; 
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath]; 
    MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    theMovie.scalingMode = MPMovieScalingModeAspectFill; 
    [theMovie play]; 
    MPMoviePlayerViewController *moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:movieURL]; 
    [self presentMoviePlayerViewControllerAnimated:moviePlayer]; 
} 

-(void)dismissMoviePlayerViewControllerAnimated { 
    landscape = NO; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// You can change the return for your needs. 
    if (landscape == YES) { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } else { return NO; } 
} 

Lo que hice aquí es Crear mi vista de película y establecer el "paisaje" BOOL en SÍ.

Luego, "shouldAutorotateToInterfaceOrientation" detectará esto y autorrotará su vista.

Y cuando la película termina, configuré el "paisaje" en NO para que la vista gire hacia atrás.

1

algunas ideas:

  • es la UINavigationController establecer que la propiedad rootViewController de la aplicación de UIWindow? No mencionaste eso. Debería hacer esto en lugar de agregar la vista del controlador de navegación a la ventana.
  • En caso de que esté creando toda la jerarquía a la vez, intente desglosarla. Puede agregar un botón a cada etapa que agregue el siguiente controlador de vista a la jerarquía.
  • Intente eliminar las animaciones de la construcción de jerarquía del controlador de vista. Hacer múltiples animaciones al mismo tiempo podría ser un problema. Por ejemplo, no está permitido presionar dos controladores de vista en un UINavigationController uno tras otro, con animated:YES. Es posible que tenga un problema similar.
  • Asegúrese de construir toda la jerarquía del controlador de vista en el hilo principal.
  • Asegúrate de que no haya otro controlador de visualización "haciéndose cargo" de la rotación (como escribió @MihaiFratu: esta es una razón común para los problemas de rotación que tuve que repetir :-)).
0

Tuve un problema similar.

que resuelve:

  1. que permite todas las orientaciones en el apoyo de la interfaz Orientaciones (Meta> Resumen)
  2. ahora su aplicación comenzará a girar en todas las orientaciones, si no quieres esto, entonces omita el paso 1, Sólo añadir siguiente método en AppDelegate

    • (NSUInteger) aplicación: (UIApplication *) aplicación supportedInterfaceOrientationsForWindow: (UIWindow *) ventana { retorno UIInterfaceOrien tationMaskAll; }
  3. eliminación shouldAutorotateToInterfaceOrientation todas partes

  4. añadiendo método siguiente para ver controlador para soportar Orientaciones u necesarios para su aplicación

    • (NSUInteger) supportedInterfaceOrientations { retorno UIInterfaceOrientationMaskPortrait; }
  5. puede agregar el mismo método que en el paso 4 en la subclase de MPMoviePlayerViewController por cualquier Orientaciones u necesita para reproductor de vídeo

0

esta guía me ayudó a comprobar algunos pasos que me estaba perdiendo con el fin de permitir sólo el reproductor de vídeo para ser visto en el paisaje, dejando el resto de la aplicación que se fijará en el modo vertical:

iOS6 and autorotation tip

0

Tuve mucho dolor con MPMoviePlayerViewController, que debería ser solo un controlador capaz de rotar de vertical a horizontal y viceversa. Era iOS7, aplicación iOS8 con guión gráfico.

Aquí está la solución:

  1. La aplicación debe permitir a todas las orientaciones requeridas As on the image
  2. Cada UIViewController que necesitan para apoyar el modo de retrato solo, debe implementar siguientes métodos, como este

    -(BOOL)shouldAutorotate 
    { 
        return YES; 
    } 
    
    -(NSUInteger)supportedInterfaceOrientations 
    { 
        return UIInterfaceOrientationMaskPortrait; 
    } 
    
  3. MPMoviePlayerViewController debe extenderse y los siguientes métodos deben ser modificados como este

    -(BOOL)shouldAutorotate 
    { 
        return YES; 
    } 
    
    -(NSUInteger)supportedInterfaceOrientations 
    { 
        return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    
  4. Uso presentMoviePlayerViewControllerAnimated para mostrar MPMoviePlayerViewController

0

Añadir este método en AppDelegate.m

- (NSUInteger) aplicación: (UIApplication *) aplicación supportedInterfaceOrientationsForWindow: (UIWindow *) ventana {

if(!ISIPAD) 

    { 

    if ([[self.window.rootViewController presentedViewController] isKindOfClass:[MPMoviePlayerViewController class]] && ![[self.window.rootViewController presentedViewController] isBeingDismissed]) 

    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 
    else 
    { 
     return UIInterfaceOrientationMaskPortrait; 
    } 
} 
return UIInterfaceOrientationMaskAllButUpsideDown ; 

}

Cuestiones relacionadas