Forzar correctamente o permitir el modo horizontal para video embedded de YouTube en iOS 8 sin NSNotificationCenter

Tengo problemas para capturar cuando el reproductor de youtube ingresará en pantalla completa o saldrá a pantalla completa en iOS 8 porque estas notifications se eliminaron UIMoviePlayerControllerDidEnterFullscreenNotification y UIMoviePlayerControllerWillExitFullscreenNotification para esta versión del sistema operativo.

Debido a que mi proyecto de aplicación está configurado para que solo esté en modo vertical, el video no girará al modo horizontal cuando se está reproduciendo, lo que en realidad no es muy fácil de usar cuando se ve un video en su dispositivo.

Por lo general, el usuario desea ver el video en modo vertical o en modo horizontal cuando el video entra en pantalla completa.

Esta es la forma en que lo estaba haciendo para iOS 7, que funcionaba perfectamente, pero no en iOS 8.

Primero, estableceré esta function en mi AppDelegate.m con una propiedad booleana en mi AppDelegate.h que llamé videoIsInFullscreen y la function,

 // this in the AppDelegate.h @property (nonatomic) BOOL videoIsInFullscreen; // This in my AppDelegate.m to allow landscape mode when the boolean property is set to yes/true. - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ if(self.videoIsInFullscreen == YES) { return UIInterfaceOrientationMaskAllButUpsideDown; } else { return UIInterfaceOrientationMaskPortrait; } } 

Entonces, dentro de mi ViewController.m Primero, me gustaría #import "AppDelegate.h" después de hacer esto, añadiré algunas notifications en mi método viewDidLoad ..

 -(void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerStarted) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerEnded) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; } 

Por supuesto, no te olvides de eliminarlos.

 -(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil]; } 

Luego, tuve mis funciones que recibirán llamadas cuando estas notifications reciban incendios … Aquí es donde permito el modo horizontal y luego lo vuelvo a configurar. Este es el caso de mi aplicación porque solo está configurada para soporte de retrato, pero no quiero esto para los videos de YouTube.

 // first we set our property in the our AppDelegate to YES to allow landscape mode - (void)playerStarted { ((AppDelegate*)[[UIApplication shanetworkingApplication] delegate]).videoIsInFullscreen = YES; [[UIApplication shanetworkingApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; } // Then I will set the property to NO and force the orientation to rotate to portrait. - (void)playerEnded { ((AppDelegate*)[[UIApplication shanetworkingApplication] delegate]).videoIsInFullscreen = NO; [[UIApplication shanetworkingApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; } 

Pero este no es el caso para iOS 8 … Estas notifications ya no funcionan para iOS 8, así que encontré algo similar usando estas notifications, pero no estoy muy contento porque no son 100% precisas para el reproductor de video. UIWindowDidBecomeVisibleNotification y UIWindowDidBecomeHiddenNotification Entonces, ¿cómo puedo hacer esto correctamente o al less funciona correctamente para mi video embebido en youtube y permitir el modo horizontal en iOS 8 …?

Entonces, después de investigar un poco más y profundizar en este problema … llegué a una solución usando los delegates de UIWebView , además tuve que resolver otro problema en términos de mi function - (void)playerEnded que no funcionaba correctamente en los nuevos dispositivos iPhone 6 ..

Así es como lo hice … Primero, en mi método webViewDidFinishLoad , agregué a mi vista web una evaluación de JavaScript para verificar cuándo este reproductor de video entra en modo de pantalla completa …

 - (void)webViewDidFinishLoad:(UIWebView*)webView { // adding listener to webView [_webView stringByEvaluatingJavaScriptFromString:@" for (var i = 0, videos = document.getElementsByTagName('video'); i < videos.length; i++) {" @" videos[i].addEventListener('webkitbeginfullscreen', function(){ " @" window.location = 'videohandler://begin-fullscreen';" @" }, false);" @"" @" videos[i].addEventListener('webkitendfullscreen', function(){ " @" window.location = 'videohandler://end-fullscreen';" @" }, false);" @" }" ]; } 

Entonces, en mi - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType método - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType , - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType cuando mi url de request coincide con el estado del reproductor de youtube, así .. Esto activa nuestra function para permitir el modo horizontal o forzar nuevamente al modo vertical … o tal vez cualquier otro tipo de trabajo que quieras hacer …

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // allows youtube player in landscape mode if ([request.URL.absoluteString isEqualToString:@"ytplayer://onStateChange?data=3"]) { [self playerStarted]; return NO; } if ([request.URL.absoluteString isEqualToString:@"ytplayer://onStateChange?data=2"]) { [self playerEnded]; return NO; } } 

Y, por último, necesitaba ajustar la function playerEnded para forzar el modo vertical para dispositivos iPhone 6 ..

 - (void)playerEnded { [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger:UIInterfaceOrientationPortrait] forKey:@"orientation"]; ((AppDelegate*)[[UIApplication shanetworkingApplication] delegate]).videoIsInFullscreen = NO; [self supportedInterfaceOrientations]; [self shouldAutorotate:UIInterfaceOrientationPortrait]; [[UIApplication shanetworkingApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; } 

Casi, me perdí. También agregué estas otras dos funciones.

 - (NSInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (BOOL)shouldAutorotate:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } 

Entonces, finalmente puedo captar el estado del jugador real y desplegar mis funciones para hacer un trabajo o lo que quiera en el momento adecuado, en mi caso cambiar la orientación …

Espero que esto ayude a alguien más..

Estoy trabajando en swift, yo mi jugador ejecuta la película tanto en dirección vertical como horizontal. Primero revisé tres modos: retrato, landscapeleft, landscaperight. En segundo lugar escribí esta function en all viewController:

  isFullScreen = false override func shouldAutorotate() -> Bool { if isFullScreen == true { return true }else{ return false } } 

En tercer lugar cambio el valor de isFullScreen en esta function:

 func playerView(playerView: YTPlayerView!, didChangeToState state: YTPlayerState) { switch (state) { case YTPlayerState.Playing: println("started to play") isFullScreen == true shouldAutorotate() case YTPlayerState.Paused: println("paused") default: println("non of sttate") break } } 

¡Y el video se ejecuta tanto en el modo vertical como en el horizontal! Lo interesante es que no configuro isFullScreen en falso nuevamente cuando detengo el video o me desploop de la pantalla completa. ¡Sin embargo, no gira! ¿Puede alguien explicar esto?