Я создаю приложение, которое показывает слой предварительного просмотра видео, используя AVCaptureVideoPreviewLayer. Настройка этого довольно проста и, кажется, работает хорошо:
newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];
CGRect tmpRect = CGRectInset(recordingView.bounds, 3, 3);
[newCaptureVideoPreviewLayer setFrame:CGRectInset(tmpRect, 3, 3)];
CALayer *viewLayer = [recordingView layer];
[newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];
[self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];
[newCaptureVideoPreviewLayer release];
Позже у меня возникает ситуация, когда пользователь может заменить представление, содержащее слой предварительного просмотра, на представление, содержащее записанное видео, с помощью MPMoviePlayerController. Я настроил его так (предыдущий блок кода исходит из метода viewDidLoad: UIViewController, и это в том же контроллере, как часть его собственного метода для изменения представления:
MPMoviePlayerController * player = [[MPMoviePlayerController alloc] initWithContentURL:url];
[player.view setFrame:[detailView playerView].bounds]; // player's frame must match parent's
player.view.backgroundColor = [UIColor clearColor];
player.shouldAutoplay = NO;
player.fullscreen = NO;
player.scalingMode = MPMovieScalingModeAspectFit;
[[detailView playerView] addSubview:player.view];
Проблема в том, что когда MPMoviePlayerController добавляется к представлению, предварительный просмотр «зависает» — он показывает последний кадр того, что было перед камерой до ввода этого блока кода. Я не получаю сообщений об ошибках и не могу найти источник проблемы.
Обратите внимание, что я не выпускаю переменную player. Любые попытки сделать это ломают проигрыватель, в том числе его автоматическое освобождение или попытка освободить его в обратном вызове уведомления. Тем не менее, я не думаю, что эта проблема (хотя она и сама по себе может быть проблемой) является причиной уничтожения моего слоя предварительного просмотра.
Я был бы признателен за любую информацию, которую вы могли бы иметь в этом вопросе!
Обновление: @boredastronaut спросил ниже, как я настроил здесь представления. У меня есть один контроллер, на котором работают все представления. В моем приложении у меня есть слой предварительного просмотра и в том же месте представление, содержащее проигрыватель. Все представления загружаются в -loadView:, и я использую свойство hidden, чтобы показать/скрыть эти слои по мере необходимости.