MPMoviePlayerViewController no gira automáticamente

Estoy teniendo un comportamiento extraño donde mi MPMoviePlayerViewController no es auto-girando cuando el orientation cambios. Sin embargo, recreé la misma jerarquía de vistas en un proyecto nuevo y cuando el MPMoviePlayerViewController jugador estaba arriba, giró a cada orientación. Revisé el proyecto en busca de algo que pudiera establecer la orientación explícitamente, pero no hay nada.

Presentaré toda la información relevante aquí y las cosas que he probado hasta ahora.

La jerarquía de vistas actualmente se ve así:

  • Controlador de navegación
  • Controlador de vista "raíz" <- 'rootViewController' del controlador de navegación
  • Controlador de vista "Feed" <- Empujado en la pila de navegación por Root VC
  • Controlador de vista "Vista previa" <- Presentado como un VC modal del Feed
  • Subclase MPMoviePlayerViewController <- presentado por Feed VC a través de 'presentMoviePlayerViewControllerAnimated'

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

Cosas que he intentado:

  • Enviar manualmente el shouldAutorotateToInterfaceOrientation pila ascendente desde el VC "raíz" hasta el MPMoviePlayerViewController
  • Anulando el MPMoviePlayerViewController implementación de la subclase de shouldAutorotateToInterfaceOrientation para devolver SÍ para ambas orientaciones horizontales y SÍ para todas las orientaciones.
  • Configuración de 'Orientación de dispositivo compatible' en la pestaña de resumen del proyecto.
  • Llamando a la presentMoviePlayerViewControllerAnimated de otros VC como Feed VC

Si el reproductor de películas gira correctamente en un proyecto nuevo con la misma jerarquía de vista, lo que podría estar interfiriendo aquí. ¿Alguna idea de dónde podría estar atascada la orientación?

preguntado el 21 de mayo de 12 a las 19:05

Una aplicación que utiliza un UINavigationController (o UITabBarController) solo gira si todos los Los viewControllers visualizables (apilados/con pestañas) aceptan la rotación. En su caso, asegúrese de que la subclase MPMoviePlayerViewController realmente esté regresando YES en todos los casos al ser preguntado en shouldAutorotateToInterfaceOrientation. -

@Hasta que ciertamente lo entiendo, pero como dije: en un proyecto de prueba con la misma jerarquía de vistas, donde todas las vistas concuerdan en una rotación (retrato), el reproductor de películas giró a todas las orientaciones sin ningún problema. Editar: la última parte de su respuesta fue respondida en "Cosas que probé" en mi pregunta. ¡Gracias! -

correcto, verifique mi comentario editado ya que inicialmente no entendí completamente su jerarquía de IU. -

Oh, usted mencionó SÍ solo para el paisaje, no SÍ para todas las orientaciones. -

En general, parece ser un problema muy localizado, especialmente porque ya hizo lo correcto; tratando de recrear el problema en un proyecto mínimo. Como no logra recrear el problema en ese escenario de proyecto mínimo, su problema obviamente reside dentro de las diferencias de ambos proyectos. Si yo estuviera en tu situación, lo haría. mirar de cerca a su MPMoviePlayerViewController subclase y en el viewController de presentación ("Vista previa"). Si todo eso falla, suba más dentro de la jerarquía de VC. -

12 Respuestas

Te sugiero que no uses presentMoviePlayerViewControllerAnimated, en lugar de agregar como subvista. Creo que va a solucionar su problema muy bien.

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

Y quita el mpviewController.view cuando MPMoviePlayerPlaybackDidFinishNotification detectado. Déjame ver tu éxito...

contestado el 24 de mayo de 12 a las 06:05

Bien pensado, pero esto no funcionó :-(. Más tarde volveré a intentar recrear 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! - Dzl

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

Editar: OK, agarrando pajitas: ¿Implementas automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers en cualquiera de tus UIViewController subclases? Si es así, y vuelve NO, sus subclases deben reenviar los métodos apropiados a cualquier controlador secundario al cambiar de orientación.

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

contestado el 23 de mayo de 12 a las 19:05

Gracias, pero desafortunadamente eso tampoco funcionó para mí. Intenté configurar el archivo project-info.plist para aceptar todas las orientaciones, así como solo el paisaje, pero fue en vano. - Dzl

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

También asegúrese de no tener 2 subvistas agregadas a la principal UIWindow Como se especificó aquí:

P: ¿Por qué mi UIViewController no gira con el dispositivo?

[...]

  • La propiedad UIView del controlador de vista está incrustada dentro de UIWindow pero junto con un controlador de vista adicional.

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

Respondido el 20 de junio de 20 a las 10:06

Algunas ideas

  • Es el UINavigationController establecer como el rootViewController propiedad de su aplicación UIWindow? No mencionaste eso. Debe hacer esto en lugar de agregar la vista del controlador de navegación a la ventana.
  • En caso de que esté construyendo toda la jerarquía a la vez, intente dividirla. Puede agregar un botón a cada etapa que agregue el siguiente controlador de vista a la jerarquía.
  • Intente eliminar cualquier animación de la construcción de la jerarquía del controlador de vista. Hacer múltiples animaciones al mismo tiempo podría ser un problema. Por ejemplo, no está permitido enviar 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 su jerarquía de controladores de vista en el hilo principal.
  • Asegúrese de que no haya otro controlador de vista "que se haga cargo" de la rotación (como escribió @MihaiFratu: esta es una razón tan común para los problemas de rotación que tuve que repetirla :-)).

contestado el 30 de mayo de 12 a las 22:05

Solución:

Para cualquiera que pueda encontrar esto, la razón por la que el video no giraba era que estaba agregando accidentalmente RootViewController que tiene el rootViewController de la ventana, en lugar del UINavigationController.

self.window.rootViewController = navController; 

es correcta

self.window.rootViewController = rootViewController;

no está

Gracias chicos por su ayuda y aportes en el camino.

Respondido el 18 de junio de 12 a las 16:06

¿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.

Mencionaste shouldAutorotateToInterfaceOrientation: y su configuración de plist, así que no entraré en eso...

contestado el 23 de mayo de 12 a las 22:05

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

hay algunas razones detrás de su consulta ..

***Estas llamando MPMoviePlayerViewController.. así que aplique AutoOrientación en "Feed" View Controller Y trata de llamar por PushViewController..

***Utilizar MPMoviePlayerController en lugar de MPMoviePlayerViewController y agregar subvista a FeedViewController..

Código de muestra 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];

*** Verifique la configuración de destino de Xcode y aplique Habilitar todas las orientaciones.

contestado el 28 de mayo de 12 a las 07:05

Y si está usando MPMoviePlayerController en viewDidLoad, intente usarlo en viewWillAppear.. - Sólido Suave

Tuve un problema similar.

Resuelto por:

  1. habilitar todas las orientaciones en Orientaciones de interfaz admitidas (Objetivo > Resumen)
  2. ahora su aplicación comenzará a rotar en todas las orientaciones, si no desea esto, omita el paso 1, solo agregue el siguiente método en appDelegate

    • (NSUInteger)aplicación:(UIApplication *)aplicación admitidaInterfaceOrientationsForWindow:(UIWindow *)window{ return UIInterfaceOrientationMaskAll; }
  3. eliminando shouldAutorotateToInterfaceOrientation en todas partes

  4. agregando el siguiente método para ver el controlador para admitir las Orientaciones que necesita para su aplicación

    • (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
  5. puede agregar el mismo método que en el paso 4 en la subclase de MPMoviePlayerViewController para cualquier orientación que necesite para el reproductor de video

Respondido el 21 de diciembre de 12 a las 06:12

Deberías probar esto (Funcionó para mí):

Declarar en el archivo .h:

BOOL landscape;

Archivo .m:

-(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í fue Crear mi vista de película y configurar el BOOL "paisaje" en SÍ.

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

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

Respondido 11 Feb 14, 12:02

esta guía me ayudó a verificar algunos pasos que me faltaban para permitir que solo el reproductor de video se vea en modo horizontal, dejando que el resto de la aplicación se corrija en modo vertical:

Consejo de iOS6 y autorrotación

Respondido 15 Jul 14, 11:07

Tuve mucho dolor con MPMoviePlayerViewController, que debería ser el único 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 habilitar todas las posibles orientaciones requeridasComo en la imagen
  2. Cada UIViewController que necesite admitir solo el modo vertical, debe implementar los siguientes métodos, como este

    -(BOOL)shouldAutorotate
    {
        return YES;
    }
    
    -(NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    
  3. MPMoviePlayerViewController debe extenderse y los siguientes métodos deben anularse de esta manera

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

Respondido el 12 de junio de 15 a las 15:06

Agregue este método en AppDelegate.m

-(NSUInteger) aplicación:(UIApplication *)aplicación compatibleInterfaceOrientationsForWindow:(UIWindow *)window {

if(!ISIPAD)

  {

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

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

}

Respondido 22 Jul 15, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.