tipos programa producto para hacer gratis generar funciona descargar crear como codigos codigo code barras barcode avcapturesession ios11 swift4 xcode9-beta

barcode - programa - Código de barras en swift 4



programa para crear codigo de barras gratis (3)

Después de cambiar la llamada de delegado:

Desde

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)

A

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection)

Necesito configurar todos los tipos disponibles para metadataObjectTypes también como a continuación:

output.metadataObjectTypes=output.availableMetadataObjectTypes

Estoy tratando de actualizar mi aplicación a Swift 4, pero el lector de código de barras no funciona.

He aislado el código del lector de código de barras y todavía no funciona. La cámara funciona pero no detecta el código de barras.

El código funcionó bien en swift 3 iOS 10.

Este es el código completo

import AVFoundation import UIKit class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { var captureSession: AVCaptureSession! var previewLayer: AVCaptureVideoPreviewLayer! override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.black captureSession = AVCaptureSession() let videoCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video) let videoInput: AVCaptureDeviceInput do { videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice!) } catch { return } if (captureSession.canAddInput(videoInput)) { captureSession.addInput(videoInput) } else { failed(); return; } let metadataOutput = AVCaptureMetadataOutput() if (captureSession.canAddOutput(metadataOutput)) { captureSession.addOutput(metadataOutput) metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.ean8, AVMetadataObject.ObjectType.ean13, AVMetadataObject.ObjectType.pdf417] } else { failed() return } previewLayer = AVCaptureVideoPreviewLayer(session: captureSession); previewLayer.frame = view.layer.bounds; previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill; view.layer.addSublayer(previewLayer); captureSession.startRunning(); } func failed() { let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert) ac.addAction(UIAlertAction(title: "OK", style: .default)) present(ac, animated: true) captureSession = nil } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if (captureSession?.isRunning == false) { captureSession.startRunning(); } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if (captureSession?.isRunning == true) { captureSession.stopRunning(); } } func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { captureSession.stopRunning() if let metadataObject = metadataObjects.first { let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject; AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate)) found(code: readableObject.stringValue!); } dismiss(animated: true) } func found(code: String) { print(code) } override var prefersStatusBarHidden: Bool { return true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait } }

Estoy usando iOS 11 en mi iPhone, actualizado a beta 9.

¿Alguna idea? Gracias.


Después de cambiar su código de:

func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {}

a:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {}

Todo funciona de nuevo.


Lo descubrí pero Apple no lo hizo tan obvio. ¡La función de devolución de llamada del delegado AVCaptureMetadataOutputObjectsDelegate ha cambiado de nombre y los nombres de los parámetros son diferentes!

Entonces, reemplace

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)

a

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection)

Mi controlador de vista ahora está escaneando códigos QR como antes después de esto. Tiene los mismos parámetros pero el nombre del primer parámetro es diferente. Cambie los nombres de funciones y parámetros y compile / ejecute.

¡Espero que esto ayude!