Superposition sur le dessus de streaming MPMoviePlayerController
-
20-09-2019 - |
Question
Je suis passé par l'exemple de la pomme "MoviePlayer sur iPhone"
Im essayant de superposer au-dessus du MPMoviePlayerController,
il fonctionne parfaitement avec clip vidéo qui est en paquet,
mais il ne fonctionnera pas si streamer la vidéo de l'url.
la vue superposition juste se cacher derrière le joueur.
est-il un moyen d'amener la superposition vue vers le haut à l'avant?
La solution
MPMoviePlayerController crée sa propre fenêtre et définit que la fenêtre clé -. Vous le savez probablement déjà de l'exemple d'application MoviePlayer
Je ne sais pas pourquoi, mais il y a un retard lorsque le joueur utilise un flux - de sorte que le keyWindow vous obtenir juste après l'initialisation du lecteur est probablement pas la fenêtre du joueur, puisque cela semble s'ajouté plus tard
Vous pouvez « tricher » et utiliser une minuterie pour obtenir la fenêtre du lecteur quelques secondes plus tard, et ajoutez votre superposition:
[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(addMyOverlay:) userInfo:nil repeats:FALSE]
Vous pouvez écouter l'événement de UIWindowDidBecomeKeyNotification, et faire la même chose:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
Aucune de ces options est grande (j'aimerais savoir un moyen plus propre de le faire), mais il fait le travail.
Autres conseils
Vous pouvez superposer votre avis lorsque vous recevez une notification "de MPMoviePlayerContentPreloadDidFinishNotification".
Inscrivez-vous pour la notification:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
Ajout d'une vue de superposition lors de la réception de la notification:
// Notification called when the movie finished preloading.
- (void) moviePreloadDidFinish:(NSNotification*)notification
{
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count] > 1)
{
// Locate the movie player window
UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
if ([moviePlayerWindow viewWithTag:0x3939] == nil) {
self.videoOverlayView.tag = 0x3939;
[moviePlayerWindow addSubview:self.videoOverlayView];
}
[moviePlayerWindow bringSubviewToFront:self.videoOverlayView];
}
}
Une solution très simple:
appDelegate.window.backgroundColor = [UIColor clearColor];
appDelegate.window.windowLevel = 2;
Cela permet de garder votre interface utilisateur de l'application au-dessus de la fenêtre vidéo.
Réponse précédente était basée sur la minuterie. Et fixe 5 secondes.
Quand le joueur de film commence, une nouvelle fenêtre est ajoutée à l'application.
Utilisez une minuterie pour vérifier une nouvelle fenêtre météo est ajoutée à votre application ou non.
Lorsqu'une fenêtre (fenêtre du lecteur de film) est ajouté. définir des notifications.
-(void)viewDidLoad{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePreloadDidFinish:)
name:MPMoviePlayerContentPreloadDidFinishNotification
object:nil];
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
// Register to receive a notification when the movie scaling mode has changed.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieScalingModeDidChange:)
name:MPMoviePlayerScalingModeDidChangeNotification
object:nil];
videoListController.xmlClassVideoList=t;
// here ttttt is a timer declared in .h file
tttttt=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(startMy) userInfo:nil repeats:YES];
}
-(void)startMy{
NSArray *windows = [[UIApplication sharedApplication] windows];
NSLog(@"%i",[windows count]);
// depends on your application window
// it may be 1/2/3
if ([windows count] > 3) {
// Locate the movie player window
[tttttt invalidate];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil];
}
}