2016-11-03 6 views
1

こんにちは私はswift3AVFoundationを使用して請求書のバーコードを検出しています。私の請求書は1行に最大3つのバーコードを持っています。どのようにして1つの文字列に合計のバーコードを組み合わせ、行のすべてのバーコードが検出されて1つの文字列に結合された後に操作を停止することができますか?ここSwift 3が1行で複数のバーコードを検出する

は私のサンプル法案は、下

で3バーコードがここにあります

enter image description here

である私のAVCaptureMetadataOutputObjectsDelegate機能は

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
     // This is the delegate'smethod that is called when a code is readed 
     for metadata in metadataObjects { 
      let readableObject = metadata as! AVMetadataMachineReadableCodeObject 
      let code = readableObject.stringValue 


      self.dismiss(animated: true, completion: nil) 
      self.delegate?.barcodeReaded(barcode: code!) 
      print(code!) 
      print(readableObject.type) 
     } 
    } 

どのように修正することができています〜まですべての3つのバーコードをスキャンして組み合わせ、すべてのバーコードがデコードされたときにViewcontrollerに通知しますか?どんな助けでも大変感謝しています。おかげ

答えて

2

はわずか3つのバーコードが検出されない限り、スキャンを停止してからコードを組み合わせないでください:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { 
    // This is the delegate'smethod that is called when a code is headed 

    guard metadataObjects.count == 3 else { return } 

    var finalString: String = "" 

    for metadata in metadataObjects { 
     let readableObject = metadata as! AVMetadataMachineReadableCodeObject 
     let code = readableObject.stringValue 

     finalString.append(code!) 
     print(code!) 
     print(readableObject.type) 
    } 

    self.dismiss(animated: true, completion: nil) 
    self.delegate?.barcodeReaded(barcode: finalString) 
} 
+0

おかげで、良い解決策でなければなりません。しかし1つの問題は、1行に1.2または3のバーコードがあることです。その行のすべてのバーコードを読み取る必要があります –

+0

このような場合は、「ガード」ステートメントを削除する必要があります。しかし、ユーザーがiPhoneを適切に配置していないため、バーコードが1つだけであるか、複数のバーコードの1つがスキャンされている場合を区別する必要があります。 – Avt

+0

私はまだ検出領域の使用を考えています。例えば、rectangeには線が入っています。あなたはそれが可能だと思いますか? –

関連する問題