Правильное отклонение контроллера представления с помощью AVCaptureSession и AVCaptureVideoPreviewLayer (программно) - PullRequest
0 голосов
/ 05 октября 2019

Я представляю новый контроллер вида (cameraVC) при нажатии кнопки камеры. У cameraVC есть AVCaptureSession, который берет фотографии и видео, а также использует микрофон и отображает все это на AVCacptureVideoPreviewLayer. Все это прекрасно работает. Но когда я увольняю cameraVC с помощью функции dismiss (), я не уверен, как правильно очистить все остальное, чтобы cameraVC и его компоненты полностью выделялись / освобождались. Когда я снова нажимаю на кнопку камеры, тот же сеанс захвата все еще продолжается. Фактически, если я начал записывать видео до того, как нажал кнопку отклонения, камера продолжит запись даже тогда, когда камера больше не отображается. Я хотел бы полностью отключить cameraVC при нажатии кнопки dismiss, включая остановку и отмену выделения этого сеанса захвата и слоя предварительного просмотра.

Я пробовал, до вызова dismiss (), session.stopRunning ()и self.previewLayer.removeFromSuperLayer (). Это работает в том смысле, что они это делают, но фактический VC-камера не отменяет выделение, поэтому, когда я снова нажимаю на кнопку камеры, функции, вызываемые из viewDidLoad (), которые создают экземпляр сеанса и слоя предварительного просмотра, больше не вызываются. Я понимаю, что могу вызывать те же функции в viewWillAppear (), но разве не лучше, чтобы эти вещи не работали постоянно в фоновом режиме после первого нажатия кнопки камеры? Или же рекомендуется просто приостановить сеанс камеры в фоновом режиме после его вызова?

Еще: Когда я вызываю dismiss () для cameraVC, viewWillDisappear () вызывается, а deinit () - нет. Может ли кто-нибудь помочь объяснить, как заставить это работать, и / или каковы механизмы этого? Большое спасибо.

1 Ответ

0 голосов
/ 05 октября 2019

Я делаю три вещи, и всегда вызывается deinit.

В моем докладчике у меня есть камера класса VC, поэтому я установил ее на ноль в viewWillAppear.

ВCameraVC Я использую CMMotionManager и вызываю на нем stopAccelerometerUpdates.

Чтобы остановить AVCaptureSession, я вызываю следующий метод:

func stopCaptureSession() {
  captureSession.stopRunning()

  if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] {
    for input in inputs {
      captureSession.removeInput(input)
    }
  }
}
...