2009-08-31 12 views
5

Fui a través del ejemplo de la manzana "MoviePlayer en el iPhone"superposición en la parte superior de Transmisión MPMoviePlayerController

Im tratando de superponer en la parte superior de la MPMoviePlayerController,

funciona perfectamente con el clip de vídeo que está en el paquete,

pero no funcionará si transmito el video desde la url.

la vista de superposición simplemente se ocultará detrás del reproductor.

¿Hay alguna manera de llevar la vista de superposición hacia adelante?

Respuesta

11

MPMoviePlayerController crea su propia ventana y la configura como la ventana clave, probablemente ya lo sepa de la aplicación de ejemplo MoviePlayer.

No sé por qué, pero hay un retraso cuando el reproductor usa una transmisión, por lo que la ventana clave que aparece justo después de inicializar el reproductor probablemente no sea la ventana del jugador, ya que parece que se agregará más tarde.

Puede "trampa" y utilizar un temporizador para obtener la ventana del reproductor a los pocos segundos, y añadir su superposición:

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

O se puede detectar el evento UIWindowDidBecomeKeyNotification, y hacer lo mismo:

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

Ninguna opción es genial (me gustaría saber una manera más clara de hacerlo), pero hace el trabajo bien.

+0

Eres el hombre! ¡has resuelto mi problema! Muchas gracias – vicky

+3

realmente utilicé el UIWindowDidBecomeKeyNotification en lugar de temporizador, funciona perfectamente. no se necesita temporizador – vicky

+0

Ok, estoy de acuerdo. Que su ventana - solución es perfecta. –

1

La respuesta anterior se basó en el temporizador. & arreglado 5 segundos.

Cuando comienza el reproductor de películas, se agrega una nueva ventana a la aplicación.

Use un temporizador para verificar si una nueva ventana se agrega a su aplicación o no.

Cuando se agrega una ventana (ventana del reproductor de películas). establecer notificaciones

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

Estoy de acuerdo en que verificar cada 0.5 s tiene más sentido que esperar 5s, pero ¿por qué no solo escuchar UIWindowDidBecomeKeyNotification desde el principio y olvidar el temporizador? –

3

Se puede superponer la vista cuando se recibe "MPMoviePlayerContentPreloadDidFinishNotification" notificación.

Registro para la notificación:

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

Añadir vista superpuesta al recibir la notificación:

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

Una solución muy sencilla:

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

Esto mantendrá su interfaz de usuario de aplicación en arriba de la ventana de video.

my post

Cuestiones relacionadas