2012-05-24 10 views
6

Tengo un AVPlayer que cargo en una nueva vista cada vez que se hace clic en un enlace.No se puede eliminar o detener AVPlayer

-(void)createAndConfigurePlayerWithURL:(NSURL *)movieURL sourceType:(MPMovieSourceType)sourceType { 
self.playerItem = [AVPlayerItem playerItemWithURL:movieURL]; 
customControlOverlay = [[AFDetailViewController alloc] initWithNibName:@"AFMovieScrubControl" bundle:nil]; 
backgroundWindow = [[UIApplication sharedApplication] keyWindow]; 
[customControlOverlay.view setFrame:backgroundWindow.frame]; 
[backgroundWindow addSubview:customControlOverlay.view]; 

playerLayer = [AVPlayerLayer playerLayerWithPlayer:[AVPlayer playerWithPlayerItem:playerItem]]; 
[playerLayer.player play]; 
playerLayer.frame = customControlOverlay.view.frame; 
[customControlOverlay.view.layer addSublayer:playerLayer]; 
} 

El código anterior agrega el AVPlayer a mi aplicación y funciona bien. Tengo un botón en mi plum customControlOverlay que debería eliminar la vista y detener la reproducción de AVplayer.

-(IBAction)toggleQuality:(id)sender { 
if (qualityToggle.selectedSegmentIndex == 0) { 
    NSLog(@"HD"); 
    [playerLayer.player pause]; 
    [self.view removeFromSuperview]; 

} else if (qualityToggle.selectedSegmentIndex == 1) { 
    NSLog(@"SD"); 
} 
} 

La vista se elimina correctamente pero el reproductor todavía se reproduce en segundo plano. Después de probar un poco, el jugador no responderá a ningún código en el método toggleQuality, pero las cadenas que tengo allí a medida que las verificaciones se van registrando.

¿Alguna idea de lo que estoy haciendo mal?

+1

Utilice playerLayer.player = nil; antes de eliminar de la supervista –

+0

El sonido sigue sonando incluso si lo hago. – AFraser

+0

¿Qué pasa si haces eso en el otro orden (eliminar y luego establecer en cero)? – Squatch

Respuesta

19

Sé que es una vieja pregunta, pero podría ser útil para alguien algún día. se añade

Desde el playerLayer como sublayer y no como un subview que simplemente necesita ser retirado de su superlayer (en lugar de la supervista) y el jugador debe ajustar a cero, algo así como:

/* not sure if the pause/remove order would matter */ 
[playerLayer.player pause]; 
// uncomment if the player not needed anymore 
// playerLayer.player = nil; 
[playerLayer removeFromSuperlayer]; 
+1

salvó mi tocino. Gracias. – SpaceDog

+0

Disculpe, lo siento, ha pasado mucho tiempo. Pero, ¿dónde debería poner el código a continuación? en 'viewDidDisappear:' o 'viewWillDisappear:'? Intenté ambas cosas, pero ninguna de ellas funcionó ... ¿podrían ayudarme? Gracias por adelantado. – Calios

+0

@Lilac ¿alguna vez descubrió dónde poner este código? –

Cuestiones relacionadas