2012-05-24 9 views
6

Mam odtwarzacz AVP, który jest ładowany do nowego widoku po kliknięciu łącza.Nie można usunąć ani zatrzymać programu 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]; 
} 

Powyższy kod dodaje odtwarzacz AVP do mojej aplikacji i działa dobrze. Mam przełącznik w mojej końcówce customControlOverlay, który powinien usunąć widok i zatrzymać odtwarzanie AVplayera.

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

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

Widok jest poprawnie usunięty, ale odtwarzacz nadal jest odtwarzany w tle. Po przetestowaniu bitów gracz nie zareaguje na żaden kod w metodzie toggleQuality, ale ciągi, które mam tam, gdy czeki są rejestrowane.

Jakieś myśli o tym, co robię źle?

+1

Użyj playerLayer.player = nil; przed usunięciem z widoku –

+0

Dźwięk będzie odtwarzany, nawet jeśli to zrobię. – AFraser

+0

Co zrobić, jeśli robisz to w innej kolejności (usuń, a następnie ustaw na zero)? – Squatch

Odpowiedz

19

Wiem, że to stare pytanie, ale może być pomocne komuś kiedyś.

Od playerLayer jest dodawana jako sublayer a nie jako subview to po prostu musi być usunięty ze swojego superlayer (zamiast SuperView) i gracz powinien być ustawiony na zero, coś jak:

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

uratowałem mój bekon. Dzięki. – SpaceDog

+0

Przepraszam, przykro, że minęło dużo czasu. Ale gdzie powinienem umieścić poniższy kod? w 'viewDidDisappear:' lub 'viewWillDisappear:'? Próbowałem obu, ale żaden z nich nie działał ... czy mógłbyś mi pomóc? Z góry dziękuję. – Calios

+0

@Lilac czy kiedykolwiek zastanawiałeś się, gdzie umieścić ten kod? –