2012-05-24 4 views
6

Ho un AVPlayer che ho caricare su una nuova visione ogni volta che si fa clic su un link.non possono rimuovere o arrestare 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]; 
} 

Il codice di cui sopra aggiunge l'AVPlayer alla mia app e funziona bene. Ho un interruttore nel mio pennino CustomControlOverlay che dovrebbe rimuovere la vista e interrompere la riproduzione di 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 viene rimossa correttamente ma il lettore continua a giocare in background. Dopo aver provato un po ', il giocatore non risponderà a nessun codice nel metodo toggleQuality ma le stringhe che ho lì come controlli verranno registrate.

Ogni pensiero su quello che sto facendo di sbagliato?

+1

Usa playerLayer.player = nil; prima di rimuovere dal superview –

+0

Il suono continua a suonare anche se lo faccio. – AFraser

+0

Cosa succede se lo si fa nell'altro ordine (rimuovere e quindi impostare su zero)? – Squatch

risposta

19

so che è una vecchia questione, ma potrebbe essere utile a qualcuno un giorno.

Dal momento che l'playerLayer è essere aggiunto come sublayer e non come una subview ha bisogno semplicemente di essere rimosso dalla sua superlayer (al posto del superview) e il lettore deve essere impostato a zero, qualcosa come:

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

mi ha salvato il bacon. Grazie. – SpaceDog

+0

Scusa, mi dispiace che è passato molto tempo. Ma dove dovrei inserire il codice qui sotto? in 'viewDidDisappear:' o 'viewWillDisappear:'? Ho provato entrambi, ma nessuno di loro ha funzionato .... potresti aiutarmi per favore? Grazie in anticipo. – Calios

+0

@Lilac hai mai capito dove inserire questo codice? –