2009-08-31 16 views
5

poszedłem na przykładzie z jabłkiem „movieplayer na iPhone'a”Nakładka na szczycie Streaming MPMoviePlayerController

Im próbuje nałożyć na górze mpmovieplayercontroller,

to doskonale współpracuje z klipu wideo, który jest w zestawie,

ale nie będzie działać, jeśli przesyłam strumień wideo z adresu URL.

widok nakładki po prostu się ukryje za odtwarzaczem.

Czy istnieje sposób na przeniesienie widoku nakładki do przodu?

Odpowiedz

11

MPMoviePlayerController tworzy własne okno i ustawia je jako okno klucza - prawdopodobnie znasz to już z przykładowej aplikacji MoviePlayer.

Nie wiem dlaczego, ale jest opóźnienie, gdy gracz używa strumienia - tak więc keyWindow, które otrzymasz zaraz po inicjalizacji odtwarzacza, prawdopodobnie nie jest oknem gracza, ponieważ wydaje się, że zostanie dodane później.

można „oszukać” i użyć timera, aby uzyskać okno odtwarzacza kilka sekund później i dodać nakładki:

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

Albo można wykrywać zdarzenie UIWindowDidBecomeKeyNotification, i zrobić to samo:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyWindowChanged:) name:UIWindowDidBecomeKeyNotification object:nil]; 

Żadna z opcji nie jest świetna (chciałbym poznać dokładniejszy sposób wykonania tej czynności), ale wykonuje to zadanie.

+0

Jesteś mężczyzną! rozwiązałeś mój problem! Dzięki dużo – vicky

+3

faktycznie użyłem UIWindowDidBecomeKeyNotification zamiast timera, działa idealnie. nie potrzeba zegara. – vicky

+0

OK Zgadzam się. To twoje okno - rozwiązanie jest idealne. –

1

Poprzednia odpowiedź została oparta na czasomierzu. & naprawione 5 sekund.

Po uruchomieniu odtwarzacza filmowego do aplikacji dodawane jest nowe okno.

Użyj stopera, aby sprawdzić pogodę, czy do aplikacji zostało dodane nowe okno.

Po dodaniu okna (okno odtwarzacza filmów). ustaw powiadomienia.

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

Zgadzam się, że sprawdzanie co 0.5s ma więcej sensu niż czekanie na 5s, ale dlaczego nie tylko słuchać UIWindowDidBecomeKeyNotification od samego początku i zapomnieć o czasomierzu? –

3

można nałożyć swój pogląd po otrzymaniu „MPMoviePlayerContentPreloadDidFinishNotification” powiadomienia.

Rejestracja na zgłoszenia:

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

Dodaj nakładki widok po otrzymaniu zgłoszenia:

// 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

bardzo proste rozwiązanie:

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

to zachowa swoją aplikację UI na w górnej części okna wideo.

my post