2016-11-07 8 views
2

iOS 10のSwift 3(Xcode 8.1)を使用したQRコードスキャナーアプリケーションを構築していますが、AVFoundation Frameworkを使用しています。スキャンを成功させた後にスキャンを停止し、画面をタップした後などにスキャナを再起動する方法を知っている人はいますか?スキャン成功後のAVFoundationの停止

EDIT:

import UIKit 
import AVFoundation 

@available(iOS 10.0, *) 
class QRCodeViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate { 
var captureSession:AVCaptureSession? 
var videoPreviewLayer:AVCaptureVideoPreviewLayer? 
var qrCodeFrameView:UIView? 

let supportedBarCodes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeAztecCode] 

override func viewDidLoad() { 
    super.viewDidLoad() 

let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    do { 
     let input = try AVCaptureDeviceInput(device: captureDevice) 

     captureSession = AVCaptureSession() 
     captureSession?.addInput(input) 

     let captureMetadataOutput = AVCaptureMetadataOutput() 
     captureSession?.addOutput(captureMetadataOutput) 

     captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 

     captureMetadataOutput.metadataObjectTypes = supportedBarCodes 

     videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
     videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill 
     videoPreviewLayer?.frame = view.layer.bounds 
     view.layer.addSublayer(videoPreviewLayer!) 

     captureSession?.startRunning() 


     qrCodeFrameView = UIView() 

     if case (qrCodeFrameView?.isHidden)! = true  { 
      qrCodeFrameView?.layer.borderColor = UIColor.green.cgColor 
      qrCodeFrameView?.layer.borderWidth = 2 
      view.addSubview(qrCodeFrameView!) 
      view.bringSubview(toFront: qrCodeFrameView!) 
     } 

    } catch { 
     print(error) 
     return 
    } 

} 

override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 
    return UIInterfaceOrientationMask.portrait 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

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

    if metadataObjects == nil || metadataObjects.count == 0 { 
     qrCodeFrameView?.frame = CGRect.zero 
     return 
    } 




    let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 


    if supportedBarCodes.contains(metadataObj.type) { 

     let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
     qrCodeFrameView?.frame = barCodeObject!.bounds 
    print(metadataObj.stringValue) 

} 
+0

にあなたには、いくつかの作品を共有することができ、これを試してみてください:ここでは は私のコードのスニペット(戻り値と何が起こるかのノーコード)でありますコードの? –

+0

@MuseerAnsari質問に – Marco

+0

コードを追加しました。私の答えをチェックして、問題がある場合は教えてください。よろしくお願いします! –

答えて

1

あなたのデリゲートメソッド

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

if metadataObjects == nil || metadataObjects.count == 0 { 
    qrCodeFrameView?.frame = CGRect.zero 
    return 
} 

let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject 


if supportedBarCodes.contains(metadataObj.type) { 

    let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj) 
    qrCodeFrameView?.frame = barCodeObject!.bounds 
    print(metadataObj.stringValue) 

    // Stop capture session 
    videoPreviewLayer?.isHidden = true 
    qrCodeFrameView?.isHidden = true 
    self.captureSession?.stopRunning() 
} 
+0

ありがとうございました:) – Marco

+0

歓迎と幸せコーディング:) –

+0

素晴らしい、ありがとう、魅力のような作品 – Badrinath

関連する問題