iOS Swift 扫描多个条形码

标签 ios swift barcode-scanner

我使用以下代码来扫描条形码:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    var highlightViewRect = CGRectZero

    var barCodeObject : AVMetadataObject!

    var detectionString : String!

    let barCodeTypes = [AVMetadataObjectTypeUPCECode,
        AVMetadataObjectTypeCode39Code,
        AVMetadataObjectTypeCode39Mod43Code,
        AVMetadataObjectTypeEAN13Code,
        AVMetadataObjectTypeEAN8Code,
        AVMetadataObjectTypeCode93Code,
        AVMetadataObjectTypeCode128Code,
        AVMetadataObjectTypePDF417Code,
        AVMetadataObjectTypeQRCode,
        AVMetadataObjectTypeAztecCode
    ]


    // The scanner is capable of capturing multiple 2-dimensional barcodes in one scan.

    for metadata in metadataObjects {
        for barcodeType in barCodeTypes {

            if metadata.type == barcodeType {
                barCodeObject = self.previewLayer.transformedMetadataObjectForMetadataObject(metadata as! AVMetadataMachineReadableCodeObject)

                highlightViewRect = barCodeObject.bounds

                detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue

                let len = detectionString.characters.count
                print("raw=\(detectionString)")
                if len == 25 {
                    detectionString=detectionString.substringWithRange(Range<String.Index>(start: detectionString.startIndex.advancedBy(3), end: detectionString.endIndex.advancedBy(0)))
                } else if len > 22 {
                    detectionString=detectionString.substringWithRange(Range<String.Index>(start: detectionString.startIndex.advancedBy(22), end: detectionString.endIndex.advancedBy(0)))
                }
                print("mod=\(detectionString)")
            }

        }
    }

    self.session.stopRunning()
    sendScan(detectionString)

    self.highlightView.frame = highlightViewRect
    self.view.bringSubviewToFront(self.highlightView)

}

看起来它应该从同一次扫描中捕获多个条形码。然而,它只捕获一个。我确信我在这里做错了什么,但我不确定是什么。

最佳答案

同时检测的最大数量为4,此数量仅适用于二维条码。一维条形码识别仅限于 1 次检测。有关详细信息,请参阅此引用:

Apple: Technical Note TN2325

运行您的代码(就所提供的而言),让我获得多个(2D)检测。请注意,sendScan 方法仅发送最后检测到的项目。

对您的代码进行轻微修改:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

    var captures : [String] = []

    for metadata in metadataObjects {

        var detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue


        let len = detectionString.characters.count
        print("raw=\(detectionString)")
        if len == 25 {
            detectionString = detectionString.substringWithRange(Range<String.Index>(start: detectionString.startIndex.advancedBy(3), end: detectionString.endIndex.advancedBy(0)))
        } else if len > 22 {
            detectionString = detectionString.substringWithRange(Range<String.Index>(start: detectionString.startIndex.advancedBy(22), end: detectionString.endIndex.advancedBy(0)))
        }
        print("mod=\(detectionString)")


        captures.append(detectionString)

    }

    print("Captured \(captures.count) barcodes.")

}

产生此输出:

raw=www.barcode1.co.za
mod=www.barcode1.co.za
raw=http://www.moxx.in
mod=http://www.moxx.in
raw=http://www.harrowhouse.com/
mod=.com/
raw=Ver1
mod=Ver1
Captured 4 barcodes.

关于iOS Swift 扫描多个条形码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404015/

相关文章:

iphone - UIActivity 指示器不显示

ios - 在 UIStackView 中设置 anchor 和位置

barcode - ZPL-如何增加^ BC(Code 128)条形码的宽度

java - zxing条码扫描仪的android list 文件中需要添加什么?

ios - 如何在用户单击 UIButton 时删除键盘

ios - Alamofire json 请求 Swift 3

android - 使用 Flutter 接收共享文件 Intent

ios - 无法隐藏 ViewController 的状态栏嵌入在 NavigationController 中

ios - NSMutableAttributedString addAttribute for range 适用于所有字符串

mobile - 图像到条形码识别