2016-11-07 69 views
2

我正在用iOS 10构建Swift 3(Xcode 8.1)的QR码扫描器应用程序,我正在使用AVFoundation Framework。是否有人知道如何在成功扫描后停止扫描,并在点击屏幕或类似物之后重新激活扫描仪?成功扫描后AVFoundation停止

编辑: 这里是我的代码片段(没有什么用的返回值发生代码):

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