SWIFT! Как перезапустить сессию видео сканирования QR кода и View с анимацией в TabBarController?

После логина в приложение, есть tab bar с 4 view controllers, один из контроллеров содержит анимацию и открывает видео сессию для считывания QR и EAN кодов, при переключение между табами и возвращение назад на таб сканирования не могу перезапустить анимацию и видео сессию...

Понимаю, что нужно закрыть сессию (ошибка - Multiple audio/video AVCaptureInputs are not currently supported) Но не могу понять где и как, что бы она запутилась Тоже самое с вьюшкой с анимацией, после возврата на экран сканера - анимация остановлена.

    import UIKit
    import AVFoundation

    class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {

    //MARK: - Outlet

    @IBOutlet weak var camView: UIView!
    @IBOutlet weak var kvadroView: UIView!
    @IBOutlet weak var redLine: UIView!

    //MARK: - Propertis
    var video = AVCaptureVideoPreviewLayer()
    let session = AVCaptureSession() //настройка сессии, обьявление
    var QR: String = ""
    var EAN13: String = ""
    var EAN8: String = ""

    //MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        kvadroView.backgroundColor = UIColor.white.withAlphaComponent(0.2)
        self.navigationController?.navigationBar.isHidden = true
        setupVideo()
        startRunning()
    }
    override func viewWillAppear(_ animated: Bool) {
     //   refreshView() // не помогает
    }
    override func viewDidDisappear(_ animated: Bool) { // остановка работы видео
        self.video.isHidden = true
            self.session.stopRunning()
}

//MARK: - Function

func setupVideo() {
    let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
    do {
        let input = try AVCaptureDeviceInput(device: captureDevice!)
        session.addInput(input)
    } catch {
        fatalError(error.localizedDescription)
    }
    let output = AVCaptureMetadataOutput()
    session.addOutput(output)
    output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
    output.metadataObjectTypes = [.qr, .ean13,.ean8]
    video = AVCaptureVideoPreviewLayer(session: session)
    video.frame = camView.layer.bounds
    video.videoGravity = .resizeAspectFill
}
func startRunning() {
    camView.layer.addSublayer(video)
    session.startRunning()
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    guard metadataObjects.count > 0 else { return }
    if let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject {
        if object.type == AVMetadataObject.ObjectType.qr {
            QR = object.stringValue ?? ""
            self.camView.layer.sublayers?.removeLast()
            self.session.stopRunning()
            let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
            let sendDataVC = storyboard.instantiateViewController(identifier: "DiscountViewController") as! DiscountViewController
            sendDataVC.idScan = QR
            navigationController?.pushViewController(sendDataVC, animated: true)
        }
        else if object.type == AVMetadataObject.ObjectType.ean13 {
            
            EAN13 = object.stringValue ?? ""
            self.camView.layer.sublayers?.removeLast()
            self.session.stopRunning()
            let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
            let sendDataVC = storyboard.instantiateViewController(identifier: "DiscountViewController") as! DiscountViewController
            sendDataVC.idScan = EAN13
            navigationController?.pushViewController(sendDataVC, animated: true)
        } else {
            EAN8 = object.stringValue ?? ""
            self.camView.layer.sublayers?.removeLast()
            self.session.stopRunning()
            let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
            let sendDataVC = storyboard.instantiateViewController(identifier: "DiscountViewController") as! DiscountViewController
            sendDataVC.idScan = EAN8
            navigationController?.pushViewController(sendDataVC, animated: true)
        }
    }
}

func refreshView() {
self.viewDidLoad()
}
//MARK: - Action
    }

Ответы (1 шт):

Автор решения: Michail
 override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        if (captureSession?.isRunning == false) {
            captureSession.startRunning()
        }
        
        redLine.animation()
        
    }
    
    override func viewDidDisappear(_ animated: Bool) { // остановка работы видео
        super.viewWillDisappear(animated)
        if (captureSession?.isRunning == true) {
            captureSession.stopRunning()
        }
    }
→ Ссылка