如何在按下按钮时扫描二维码? [英] How to scan for QR codes on button press?

查看:29
本文介绍了如何在按下按钮时扫描二维码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用https://www.hackingwithswift.com/example-code/media/how-to-scan-a-qr-code提供的代码来制作我自己的扫描应用程序。但我喜欢在按下按钮时进行扫描。现在,我将教程中的viewDidLoad()部分放入它自己的函数中:

func cameraScanningLayer(){
    view.backgroundColor = UIColor.blackColor()
    captureSession = AVCaptureSession()

    let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    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: dispatch_get_main_queue())
        // need to scan barcode + QRcode
        metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code]
    } else {
        failed()
        return
    }

    // Previewlayer with camera
    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
    previewLayer.frame = viewForLayer.bounds;
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    viewForLayer.layer.addSublayer(previewLayer);

    captureSession.startRunning();
}

按钮操作调用函数:

func buttonScanAction() {
    print("Scan")
    scanEnabled = true // like to use some kind of bool/switch
    self.cameraScanningLayer()
}

我遇到的问题是:

1)加载时,摄像机不在视图中

2)按下按钮后,摄像机处于可视状态,但它始终自动扫描

所以我想使用全局变量:

var scanEnabled: Bool = false

然后,当单击该按钮时,将其设置为TRUE即可启用扫描。

这里有一张素描供参考:

编辑 我的快速解决方案可能不是正确的方法。

我更换了

 let metadataOutput = AVCaptureMetadataOutput() {...} else {
            failed()
            return
        }

并将其放在If语句之间

if (scanEnabled == true) {

        let metadataOutput = AVCaptureMetadataOutput()

        if (captureSession.canAddOutput(metadataOutput)) {
            captureSession.addOutput(metadataOutput)

            metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
            // to use them both wwe need to skip AVMetadataObjectTypeQRCode
            metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code]
            scanEnabled = false
        } else {
            failed()
            return
        }
        } 

推荐答案

该教程的作者。我的方法是使用专用的扫描视图控制器,但我猜您想要将其与现有的视图控制器统一起来--这很好。这两种方法都有效。

如果你想一直显示相机界面(即使在没有主动识别二维码的时候),那么你使用布尔值来跟踪扫描是否启用的计划是一个很好的计划。我的示例代码有一个被调用的foundCode()方法,当找到代码时也会调用dismissViewControllerAnimated()

在您的版本中,您需要让foundCode()执行停止异常、处理解雇等所有工作。然后,您可以在一个位置为scanEnabled布尔值添加检查。

应该是这样的:

func foundCode(code: String) {
    if scanCode == true {
        print(code)

        captureSession.stopRunning()
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        dismissViewControllerAnimated(true, completion: nil)
    }
}

如果您愿意,可以将scanCode == true检查上移到didOutputMetadataObjects以保存不必要的方法调用。

这篇关于如何在按下按钮时扫描二维码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆