2017-12-09 13 views
2

バーコードリーダアプリケーションを作成していますが、コード128のリニアタイプのバーコードは検出できません。Qrコード、EAN13タイプ、ISBNタイプに問題はありません。私のコードは非常に簡単です:スウィフト:リニアタイプのバーコードを検出できません

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

     if metadataObjects.count != 0 { 
      if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject { 
       if object.type == AVMetadataObject.ObjectType.qr { 
        if let text = object.stringValue { 
         print(text) 

         session.stopRunning() 

         let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: UIAlertControllerStyle.alert) 
         alertVC.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in 
          self.session.startRunning() 
         })) 
         present(alertVC, animated: true, completion: nil) 
        } 
       } else { 
        if let text = object.stringValue { 
         print("Other code detected: ", text) 
        } 
       } 
      } 
     } 

私は私のアプリをテストするためにthis無料のオンラインバーコードジェネレータを使用していました。私はリニアコード以外のほとんどのバーコードを検出することができます。誰もこのような問題に遭遇しましたか?

+0

:配列の最初の要素だけは、私が代わりにAVMetadataObject?AVMetadataObject.ObjectTypeがあなたの比較において冗長である任意の要素を返します添字[0]の配列.firstを使用することをお勧めします使用されている場合は別のオプションですあなたは設定しました。 'AVMetadataObjectTypeCode128Code'に新しい構文' [.code128] 'を含めるようにしてください –

+1

@LeoDabusありがとう、私はこの部分を完全に逃しました。それはすべて正常に動作することを追加した後。 – Koh

答えて

1

AVCaptureMetadataOutputオブジェクトタイプmetadataObjectTypesを設定する場合は、AVMetadataObjectTypeCode128Code [.code128]を必ず含めてください。

metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128] 

あなたが利用可能なすべての型を返すAVCaptureMetadataOutputプロパティavailableMetadataObjectTypes使用することができ、使用可能なすべてのメタデータ・オブジェクト・タイプ許可したい場合:あなたはどの顔を除いて、その後のすべてを許可したい場合

metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes 

を最初のものはavailableMetadataObjectTypesの最初の要素を削除できます。あなたの実際のコードに

metadataOutput.metadataObjectTypes = Array(metadataOutput.availableMetadataObjectTypes.dropFirst()) 

わずか数ノート:手動であなたのアプリケーションで必要とされるだけのバーコードの種類を選択した方がよいので、Appleが近い将来にメタデータ要素の順序を変更する場合があります。空であるかどうかをチェックするために、要素数がゼロに等しい場合、要素の数をチェックしないでください。配列には、if !metadataObjects.isEmpty { //...のisEmptyというプロパティがあります。あなたは `どのmetadataObjectTypes`を表示する必要が

if let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject { 
    if object.type == .qr { 
     if let text = object.stringValue { 
      print(text) 
      session.stopRunning() 
      let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: .alert) 
      alertVC.addAction(UIAlertAction(title: "Ok", style: .default) { _ in 
       self.session.startRunning() 
      }) 
      present(alertVC, animated: true) 
     } 
    } 
    else 
    if let text = object.stringValue { 
     print("Other code detected: ", text) 
    } 
} 
関連する問題