2014-09-10 23 views
12

Mam aplikację, w której użytkownicy mogą otwierać filmy z UIWebview, w tym z YouTube. W iOS7 mogłem otrzymać powiadomienie, gdy zaczęło się odtwarzanie, lub gdy stało się pełnoekranowe, co jest dla mnie ważne, aby pokazać pewne opcje użytkownikowi i zmodyfikować interfejs.Wykryj, kiedy wideo z przeglądarki stanie się pełnoekranowe w ios8

Ja używałem tego:

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

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

Jednak od systemów iOS 8, nie mogę osiągnąć. To tak, jak powiadomienia nie są już uruchamiane z filmów UIWebview. Jednak nadal jest on wywoływany z normalnych filmów wideo, a nie z przeglądarki internetowej, co testowałem.

Jakieś pojęcie, co się zmieniło?

Odpowiedz

19

Jest to obejść Znalazłem za to ..

[[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]; 
+3

Odkryłam, że ** UIWindowDidBecomeVisibleNotification ** jest wywoływana, gdy wideo zaczyna grać w trybie pełnoekranowym. I ** UIWindowDidBecomeHiddenNotification ** jest wywoływana, gdy wideo znika. –

+0

@IgorKulagin to prawda. – NorthBlast

+0

Uratujesz moją noc :) –

5

Dla Swift & 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") 
} 
0

Swift:

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

+0

To nie będzie działać na iOS 9, itp. Jest teraz przestarzałe. – Tobonaut

0

@ odpowiedź NorthBlast za działa dobrze w wykrywaniu każdego pojawiającego się UIWindow na wierzchu UIViewController, który zawiera UIWebView. Niestety, trudno jest filtrować, jakiego rodzaju jest UIWindow (ponieważ, cóż ... nie można naprawdę stwierdzić, czy jest to wideo, czy jakikolwiek inny rodzaj okna).

Istnieją 3 przypadki szczególne wolę do filtrowania, w którym masz pewność, że są NIE wideo okna odtwarzacza, są to:

1) _UIAlertControllerShimPresenterWindow, który jest swego rodzaju oknem, który pojawia się w przypadku korzystania ostrzeżenia (takie jak UIAlertView).

2) UITextEffectsWindow, która pojawia się podczas prezentacji specjalnych okien systemu iOS (takich jak okno udostępniania, UIActivityViewController).

3) UIRemoteKeyboardWindow, który pojawia się podczas prezentacji klawiatury (z jakiegoś powodu ta klasa pojawiła się tylko przy użyciu Swift, ale w Objective-C nie ... nie ma pojęcia, dlaczego tak się dzieje).

Tak, aby zapisać się do powiadomień, używam (podobnie jak @NorthBlast powiedział):

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

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

Następnie implementacje:

- (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; 
}