gpt4 book ai didi

ios - 成功扫描后 AVFoundation 停止

转载 作者:可可西里 更新时间:2023-11-01 00:58:05 24 4
gpt4 key购买 nike

我正在使用适用于 iOS 10 的 Swift 3(Xcode 8.1) 构建二维码扫描器应用程序,并且我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com