ios - 扫描成功后 AVFoundation 停止

标签 ios swift xcode

我正在使用 Swift 3(Xcode 8.1) 为 iOS 10 构建一个 QR 码扫描仪应用程序,并且我正在使用 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)

}

最佳答案

在您的委托(delegate)方法中尝试此操作

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()
}

关于ios - 扫描成功后 AVFoundation 停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40460504/

相关文章:

ios - 如何在 Swift 4 上自定义 Google Place Picker 中的导航栏?

Swift 4 中的 JSON 解码

iphone - startMonitoringForRegion 并不总是有效

ios - 为 `ECSlidingViewController` 设置子类

ios - 持续时间不随 AVPlayer currentItem 一起提供

ios - 如何隐藏 Xcode 中 xib/Storyboard 中覆盖 View 的蓝线

ios - 我无法在 Xcode 中将 iOS 分发签名身份添加到我的帐户

ios - LLDB 堆栈跟踪仅显示 XCode 中的最后 2 次调用

ios - 尝试向 iOS 设备发送推送通知 - 未收到它们

ios - 如何为 NSURLRequest 设置 x-access-token?