2009-08-31 9 views
5

Ich ging durch das Beispiel von Apple „Movieplayer auf dem iPhone“Overlay oben auf Streaming MPMoviePlayerController

Im Versuch, auf der Oberseite des MPMoviePlayerController zu überlagern,

es funktioniert perfekt mit Videoclip, in Bündel,

aber es funktioniert nicht, wenn ich das Video von der URL streame.

die Overlay-Ansicht wird nur hinter dem Spieler verstecken.

Gibt es eine Möglichkeit, die Overlay-Ansicht nach vorne zu bringen?

Antwort

11

MPMoviePlayerController erstellt ein eigenes Fenster und legt dieses als das Schlüsselfenster fest - das wissen Sie wahrscheinlich schon aus der MoviePlayer-Beispiel-App.

Ich weiß nicht warum, aber es gibt eine Verzögerung, wenn der Player einen Stream verwendet - so das KeyWindow, das Sie direkt nach der Initialisierung des Players erhalten, ist wahrscheinlich nicht das Fenster des Players, da das später hinzugefügt wird.

Sie können „betrügen“ und einen Timer verwenden, um das Player-Fenster ein paar Sekunden später zu bekommen, und das Overlay hinzufügen:

[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(addMyOverlay:) userInfo:nil repeats:FALSE] 

Oder Sie können für die UIWindowDidBecomeKeyNotification Ereignis hören, und das Gleiche tun:

Keine der Optionen ist großartig (ich würde gerne einen saubereren Weg kennen, dies zu tun), aber es macht den Job erledigt.

+0

Du bist der Mann! Du hast mein Problem gelöst! Vielen Dank – vicky

+3

tatsächlich habe ich die UIWindowDidBecomeKeyNotification eher als Timer verwendet, es funktioniert perfekt. kein Timer benötigt. – vicky

+0

Ok ich stimme zu. Dass Ihre Fensterlösung perfekt ist. –

1

Vorherige Antwort war auf Timer basiert. & 5 Sekunden fixiert.

Wenn der Movie-Player gestartet wird, wird der Anwendung ein neues Fenster hinzugefügt.

Verwenden Sie einen Timer, um zu überprüfen, ob Ihrer Anwendung ein neues Fenster hinzugefügt wurde oder nicht.

Wenn ein Fenster (Film-Player-Fenster) hinzugefügt wird. Benachrichtigungen festlegen

-(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]; 
    } 
} 
+2

Ich stimme zu, dass die Überprüfung alle 0.5s sinnvoller ist als das Warten auf 5s, aber warum nicht einfach von Anfang an auf UIWindowDidBecomeKeyNotification warten und den Timer vergessen? –

3

Sie können Ihre Ansicht überlagern, wenn Sie „MPMoviePlayerContentPreloadDidFinishNotification“ Benachrichtigung.

Register für die Meldung:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePreloadDidFinish:) 
              name:MPMoviePlayerContentPreloadDidFinishNotification 
              object:nil]; 

Überlagerungsansicht hinzufügen, wenn die Benachrichtigung erhalten haben:

// 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]; 
    } 
} 
2

Eine sehr einfache Lösung:

appDelegate.window.backgroundColor = [UIColor clearColor]; 
appDelegate.window.windowLevel = 2; 

Dies wird auf Ihrer App UI halten oben im Videofenster.

my post

Verwandte Themen