2012-05-24 12 views
6

Ich habe einen AVPlayer, den ich in eine neue Ansicht lade, wenn auf einen Link geklickt wird.AVPlayer kann nicht entfernt oder gestoppt werden

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

Der obige Code fügt den AVPlayer meiner App hinzu und funktioniert gut. Ich habe einen Schalter in meiner customControlOverlay-Feder, der die Ansicht entfernen und den AVplayer vom Spielen stoppen sollte.

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

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

Die Ansicht wird korrekt entfernt, aber der Player spielt immer noch im Hintergrund. Nach dem Testen eines Bits reagiert der Player nicht auf irgendeinen Code in der toggleQuality-Methode, sondern auf Strings, die ich dort habe, da Überprüfungen protokolliert werden.

Irgendwelche Gedanken darüber, was ich falsch mache?

+1

Verwenden playerLayer.player = nil; bevor Sie aus Superview entfernen –

+0

Der Sound spielt weiter, auch wenn ich das tue. – AFraser

+0

Was passiert, wenn Sie das in der anderen Reihenfolge tun (entfernen und dann auf Null setzen)? – Squatch

Antwort

19

Ich weiß, es ist eine alte Frage, aber es könnte für jemanden eines Tages hilfreich sein.

Da die playerLayer wird als sublayer hinzugefügt und nicht als subview es braucht einfach von seinem Superlayer entfernt werden (anstelle des Superview) und der Spieler sollte auf Null gesetzt werden, so etwas wie:

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

sparte meinen Speck. Vielen Dank. – SpaceDog

+0

Entschuldigung, es tut mir leid, es ist eine lange Zeit. Aber, wo sollte ich den Code unten setzen? in 'viewDidDisappear:' oder 'viewWillDisappear:'? Ich habe beides versucht, aber keiner von ihnen hat funktioniert ... Könnten Sie mir bitte helfen? Danke im Voraus. – Calios

+0

@Lilac Haben Sie jemals herausgefunden, wohin Sie diesen Code setzen sollen? –

Verwandte Themen