How to scan for QR codes on button press?(如何在按下按钮时扫描二维码?)
本文介绍了如何在按下按钮时扫描二维码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用https://www.hackingwithswift.com/example-code/media/how-to-scan-a-qr-code提供的代码来制作我自己的扫描应用程序。但我喜欢在按下按钮时进行扫描。现在,我将教程中的viewDidLoad()
部分放入它自己的函数中:
func cameraScanningLayer(){
view.backgroundColor = UIColor.blackColor()
captureSession = AVCaptureSession()
let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let videoInput: AVCaptureDeviceInput
do {
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
} catch {
return
}
if (captureSession.canAddInput(videoInput)) {
captureSession.addInput(videoInput)
} else {
failed();
return;
}
let metadataOutput = AVCaptureMetadataOutput()
if (captureSession.canAddOutput(metadataOutput)) {
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
// need to scan barcode + QRcode
metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code]
} else {
failed()
return
}
// Previewlayer with camera
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
previewLayer.frame = viewForLayer.bounds;
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
viewForLayer.layer.addSublayer(previewLayer);
captureSession.startRunning();
}
按钮操作调用函数:
func buttonScanAction() {
print("Scan")
scanEnabled = true // like to use some kind of bool/switch
self.cameraScanningLayer()
}
我遇到的问题是:
1)加载时,摄像机不在视图中
2)按下按钮后,摄像机处于可视状态,但它始终自动扫描
所以我想使用全局变量:
var scanEnabled: Bool = false
然后,当单击该按钮时,将其设置为TRUE即可启用扫描。
这里有一张素描供参考:
编辑 我的快速解决方案可能不是正确的方法。
我更换了
let metadataOutput = AVCaptureMetadataOutput() {...} else {
failed()
return
}
并将其放在If语句之间
if (scanEnabled == true) {
let metadataOutput = AVCaptureMetadataOutput()
if (captureSession.canAddOutput(metadataOutput)) {
captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
// to use them both wwe need to skip AVMetadataObjectTypeQRCode
metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeCode39Code]
scanEnabled = false
} else {
failed()
return
}
}
推荐答案
该教程的作者。我的方法是使用专用的扫描视图控制器,但我猜您想要将其与现有的视图控制器统一起来--这很好。这两种方法都有效。
如果你想一直显示相机界面(即使在没有主动识别二维码的时候),那么你使用布尔值来跟踪扫描是否启用的计划是一个很好的计划。我的示例代码有一个被调用的foundCode()
方法,当找到代码时也会调用dismissViewControllerAnimated()
。
在您的版本中,您需要让foundCode()
执行停止异常、处理解雇等所有工作。然后,您可以在一个位置为scanEnabled
布尔值添加检查。
应该是这样的:
func foundCode(code: String) {
if scanCode == true {
print(code)
captureSession.stopRunning()
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
dismissViewControllerAnimated(true, completion: nil)
}
}
如果您愿意,可以将scanCode == true
检查上移到didOutputMetadataObjects
以保存不必要的方法调用。
这篇关于如何在按下按钮时扫描二维码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何在按下按钮时扫描二维码?
基础教程推荐
猜你喜欢
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01