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
以保存不必要的方法调用。
这篇关于如何在按下按钮时扫描二维码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何在按下按钮时扫描二维码?
猜你喜欢
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
- Android viewpager检测滑动超出范围 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01