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()
}
}