@ risposta di NorthBlast funziona bene per rilevare qualsiasi UIWindow
visualizzato in cima allo UIViewController
che contiene lo UIWebView
. Sfortunatamente, è difficile filtrare il tipo di UIWindow
(poiché, beh ... non puoi sapere se si tratta di un video o di un altro tipo di finestra).
Ci sono 3 casi speciali preferisco filtrare, in cui siete sicuri che siano NON video di Windows giocatore, questi sono:
1) _UIAlertControllerShimPresenterWindow
, che è una sorta di finestra che appare quando si usa avvisi (come UIAlertView
).
2) UITextEffectsWindow
, visualizzato quando si presentano finestre speciali iOS (come la finestra di condivisione, UIActivityViewController
).
3) UIRemoteKeyboardWindow
che appare quando si presenta la tastiera (per qualche ragione, questa classe mi è apparsa solo quando si usa Swift, ma su Objective-C non ha ... nessun indizio perché è così).
Quindi, per sottoscrivere le notifiche, io uso (proprio come ha detto @NorthBlast):
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(windowDidBecomeActive:)
name:UIWindowDidBecomeVisibleNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(windowDidBecomeHidden:)
name:UIWindowDidBecomeHiddenNotification
object:nil];
Poi le implementazioni:
- (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;
}
fonte
2017-03-16 17:08:26
ho trovato che ** ** UIWindowDidBecomeVisibleNotification viene chiamato quando il video inizia a giocare a schermo intero. E ** UIWindowDidBecomeHiddenNotification ** viene chiamato quando il video scompare. –
@IgorKulagin che è corretto. – NorthBlast
Mi hai salvato la notte :) –