AVPlayerLayer, существующий даже после вызова метода viewDidDisappear в iOS
В моем приложении я использую AVPlayer для воспроизведения видео на YouTube с помощью библиотеки HCYoutubeParser.
У меня вопрос, когда я загружаю новый контроллер представления, я все еще слышу звук воспроизводимого видеофайла.
Я попытался загрузить следующее представление двумя разными способами, но результат был тот же.
Способ 1
FourthViewController *fourthViewCont = [self.storyboard instantiateViewControllerWithIdentifier:@"FourthViewControllerID"];
[self.navigationController pushViewController:fourthViewCont animated:YES];
Способ 2
Использование раскадровки
Я могу избавиться от этой проблемы, добавив следующий код внутри метода viewDidDisappear
[avPlayerLayer removeFromSuperlayer];
avPlayerLayer = nil;
Но что мне нужно знать, даже когда представление исчезает, почему экземпляр avPlayerLayer имеет ссылку?
Я добавляю слой игрока, как показано ниже
[_playerContainerView.layer addSublayer:avPlayerLayer];
_playerContainerView - это не основной UIView, а UIView, расположенный внутри основного UIView.
Я объявил переменную AVPlayerLayer в расширении класса, как показано ниже
@interface PlayerViewController ()
{
AVPlayerItem *avPlayerItem;
AVPlayerLayer *avPlayerLayer;
}
а также AVPlayer и вид контейнера имеют слабые ссылки
@property (weak, nonatomic) AVPlayer *avPlayer;
@property (weak, nonatomic) IBOutlet UIView *playerContainerView;
Моя путаница еще больше возрастает в следующем сценарии: когда я возвращаюсь из PlayerViewController к своему предыдущему виду, проигрыватель корректно останавливается без какого-либо фонового звука.
Кто-нибудь может объяснить эту ситуацию?
Редактировать:
Вот как я инициализировал AVPlayer и AVPlayerLayer
_avPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem];
avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:_avPlayer];
После этих инициализаций я добавил подслой и все эти коды внутри блока завершения.
[HCYoutubeParser h264videosWithYoutubeURL:youtubeUrl completeBlock:^(NSDictionary *videoDictionary, NSError *error) {
// ...