Detectar cuando un video de vista web pasa a ser de pantalla completa en ios8

Tengo una aplicación donde los usuarios pueden abrir videos desde UIWebview, incluidos los de YouTube. En iOS7, pude get una notificación cuando comenzó a jugar, o cuando se convirtió en pantalla completa, lo que es vital para que muestre ciertas opciones al usuario y modifique la interfaz.

Solía ​​usar esto:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(VideoExitFullScreen:) name:@"UIMoviePlayerControllerDidExitFullscreenNotification" object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(VideoEnterFullScreen:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil]; 

Sin embargo, desde iOS8, no puedo lograr esto. Es como si la notificación ya no se activara desde los videos de UIWebview. Sin embargo, todavía se desencadena a partir de videos normales, que no son Webview, como he probado.

¿Alguna idea de lo que ha cambiado?

Este es el trabajo que encontré para esto …

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(VideoExitFullScreen:) name:UIWindowDidBecomeVisibleNotification object:self.view.window]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(VideoEnterFullScreen:) name:UIWindowDidBecomeHiddenNotification object:self.view.window]; 

Para Swift e iOS 9:

 NSNotificationCenter.defaultCenter().addObserverForName( UIWindowDidResignKeyNotification, object: self.view.window, queue: nil ) { notification in print("Video is now fullscreen") } NSNotificationCenter.defaultCenter().addObserverForName( UIWindowDidBecomeKeyNotification, object: self.view.window, queue: nil ) { notification in print("Video stopped") } 

Para swift:

NotificationCenter.default.addObserver(self, selector: #selector(xxx), name: NSNotification.Name.MPMoviePlayerDidExitFullscreen, object: nil)

La respuesta de @ NorthBlast funciona bien para detectar cualquier UIWindow aparezca en la parte superior del UIViewController que contiene UIWebView . Lamentablemente, es difícil filtrar qué tipo de UIWindow es (ya que, bueno … realmente no se puede saber si es un video o algún otro tipo de window).

Hay 3 casos especiales que prefiero filtrar, en los que está seguro de que NO son windows de reproductor de video, son:

1) _UIAlertControllerShimPresenterWindow , que es un tipo de window que aparece al usar alertas (como UIAlertView ).

2) UITextEffectsWindow , que aparece al presentar windows iOS especiales (como la window compartida, UIActivityViewController ).

3) UIRemoteKeyboardWindow que aparece al presentar el keyboard (por alguna razón, esta class solo apareció para mí cuando usé Swift, pero en Objective-C no … ninguna pista por qué es eso).

Entonces, para suscribirse a las notifications, uso (como dijo @NorthBlast):

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidBecomeActive:) name:UIWindowDidBecomeVisibleNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidBecomeHidden:) name:UIWindowDidBecomeHiddenNotification object:nil]; 

Luego las implementaciones:

 - (void)windowDidBecomeActive:(NSNotification *)notification { if ( [self isVideoPlayerWindow:notification.object] ) { // Do what's needed if it is a video // For example, on a live streaming radio app, I would stop the audio if a video is started } } - (void)windowDidBecomeHidden:(NSNotification *)notification { if ( [self isVideoPlayerWindow:notification.object] ) { // Do what's needed if it is a video } } - (BOOL)isVideoPlayerWindow:(id)notificationObject { /* Define non video classes here, add more if you need it */ static NSArray *nonVideoClasses = @[ @"_UIAlertControllerShimPresenterWindow", @"UITextEffectsWindow", @"UIRemoteKeyboardWindow" ]; BOOL isVideo = YES; for ( NSString *testClass in nonVideoClasses ) { isVideo = isVideo && ! [notificationObject isKindOfClass:NSClassFromString(testClass)]; } return isVideo; }