@ 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;
}
Odkryłam, że ** UIWindowDidBecomeVisibleNotification ** jest wywoływana, gdy wideo zaczyna grać w trybie pełnoekranowym. I ** UIWindowDidBecomeHiddenNotification ** jest wywoływana, gdy wideo znika. –
@IgorKulagin to prawda. – NorthBlast
Uratujesz moją noc :) –