MPMoviePlayerController girando en pantalla completa mientras que el controller de vista principal solo admite la orientación vertical

esta pregunta es solo una parte de mi problema. Estoy implementando soporte de rotation y orientación iOS6 para mi aplicación existente.

Así que tengo un ViewController que contiene un MPMoviePlayerController embedded en la vista ViewController (mi aplicación lo requiere). El usuario puede reproducir el video y verlo en la vista incrustada o hacer clic en el button de pantalla completa usando los controles pnetworkingeterminados del reproductor y el reproductor pasa al modo de pantalla completa.

Ahora he restringido el controller de vista para que solo admita la orientación vertical utilizando las nuevas API de rotation proporcionadas por iOS6.

// New Autorotation support. - (BOOL)shouldAutorotate; { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

esto funciona bastante bien el ViewController solo admite retrato y el usuario reproduce la película en la vista incrustada.

Ahora viene el problema, cuando el Usuario ingresa al modo de pantalla completa. En modo de pantalla completa, la película sigue girando, cuando giro el simulador / dispositivo. Cuando giro el dispositivo mientras la película se está reproduciendo en modo de pantalla completa con puntos de interrupción en shouldAutorotate y shouldAutorotate , todavía viene en estos dos methods que devuelven NO y UIInterfaceOrientationMaskPortrait respectivamente, pero la película sigue girando …

¿Por qué está pasando esto? … esta es una parte de mi pregunta … la segunda parte es que quiero que la película ingrese en modo horizontal cuando el usuario vaya al modo de pantalla completa. y quiero que el reproductor de películas se bloquee en modo horizontal hasta que el usuario presione el button DONE.

Por favor ayuda ….

puedes probar la function a continuación en AppDelegate :

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { } 

puedes hacer una condición aquí para ambos modos.

como si el reproductor multimedia está en pantalla completa, entonces

return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;

De lo contrario, return UIInterfaceOrientationMaskPortrait;

No lo he probado, pero creo que debería funcionar en su caso.

Gracias

Para mayor claridad, aquí está el código completo (TODO va dentro de su delegado de la aplicación):

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil]; } - (void)willEnterFullscreen:(NSNotification*)notification { NSLog(@"willEnterFullscreen"); isFullScreen = YES; } - (void)willExitFullscreen:(NSNotification*)notification { NSLog(@"willExitFullscreen"); isFullScreen = NO; } -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (isFullScreen) return UIInterfaceOrientationMaskLandscapeLeft; else return UIInterfaceOrientationMaskPortrait; } 

isFullScreen es un BOOL para ser declarado en AppDelegate.h

Sugiero utilizar un MPMoviePlayerViewController en MPMoviePlayerViewController lugar. Subclass e implementa el método UIInterfaceOrientationMaskLandscape y devuelve UIInterfaceOrientationMaskLandscape .

Es posible que también shouldAutorotateToInterfaceOrientation: implementar el método shouldAutorotateToInterfaceOrientation:

Consulte la reference de class: MPMoviePlayerViewController

Edit: También puedes echar un vistazo a esta publicación: iphone – obliga a MPMoviePlayerController a reproducir video en modo horizontal

Esto me consumió por un time y obtuve muchos errores espeluznantes diferentes, pero finalmente terminé no hacerlo a través de MPMoviePlayerController sino MPMoviePlayerViewController . Acabo de rotar el self.playerView, que es una propiedad, antes de presentarlo. También agregué la NSNotification que conducirá nuevamente al control principal y al ViewController principal después de que el video termine. Así es como lo ejecuté:

  [[NSNotificationCenter defaultCenter] removeObserver:self.playerView name:MPMoviePlayerPlaybackDidFinishNotification object:self.playerView.moviePlayer]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.playerView.moviePlayer]; self.playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:docUrl]; self.playerView.view.frame = CGRectMake(10, 10, self.frame.size.width-20, 180); [self.playerView.moviePlayer prepareToPlay]; if(IS_IPHONE_6P) { [self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)]; [self.playerView.view setCenter:CGPointMake(212, 368)]; } else if(IS_IPHONE_6) { [self.playerView.view setBounds:CGRectMake(0, 0, 375, 667)]; [self.playerView.view setCenter:CGPointMake(187, 333)]; } else if (IS_IPHONE_5) { [self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)]; [self.playerView.view setCenter:CGPointMake(160, 284)]; } else { [self.playerView.view setBounds:CGRectMake(0, 0, 480, 320)]; [self.playerView.view setCenter:CGPointMake(160, 240)]; } [self.playerView.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)]; self.playerView.modalPresentationStyle = UIModalPresentationFormSheet; self.playerView.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentViewController:self.playerView animated:YES completion:nil]; 

Y la callback movieFinishedCallback : es la siguiente,

 - (void)movieFinishedCallback:(NSNotification*)aNotification { // Obtain the reason why the movie playback finished NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]; // Dismiss the view controller ONLY when the reason is not "playback ended" if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded) { MPMoviePlayerController *moviePlayer = [aNotification object]; [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; NSLog(@"Video Closed"); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^ { [self dismissViewControllerAnimated:NO completion:nil]; self.playerView = nil; }); } } 

Esto funcionó para mí. Espero eso ayude.

en su proyecto, select el proyecto de nombre y la window derecha, select la pestaña de información. en las properties de destino de ios personalizadas, agregue la tecla y select la tecla: "Valor inicial de la orientación de la interfaz": Retrato (button inferior de inicio)

  • reconstruye tu proyecto -> ok

Para iOS 6 puedes usar esta respuesta .

Pero si admite <iOS 6 necesita un enfoque diferente.

Debe crear un controller de navigation personalizado y agregar methods para su creación con el controller raíz y el método de rotation.

Se verá como: file m y file h .

Y en su AppDelegate debe llamar al método init:

En el file h:

 #import "IORNavigationController.h" 

y

 @property (nonatomic, retain) IORNavigationController* navigationController; 

En el file m:

 self.navigationController = [[[MyNavigationController alloc] initWithRootViewController:start] autorelease]; 

utilizar esta

 moviePlayerController.view.transform = CGAffineTransformMakeRotation(M_PI/2); 

Funciona con ios 7

Simplemente agregue este código a su controller de vista

 -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; }