最近做项目遇到了二维码、条形码扫描的需求,使用AVFoundation实现了一下,这里简单说一下
导入框架
由于使用AVFoundation,只需在swift文件开头import AVFoundation即可
具体实现
在要实现此功能的类中定义一个AVCaptureSession对象
//初始化链接对象
let session = AVCaptureSession()
接下来我们在viewDidLoad
方法中进行配置
//获取摄像设备
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
//创建输入流,这里可能有异常抛出,注意!!!
let input = try! AVCaptureDeviceInput.init(device: device)
//创建输出流
let output = AVCaptureMetadataOutput()
//设置代理 在主线程里刷新
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue() )
//高质量采集率
session.canSetSessionPreset(AVCaptureSessionPresetHigh)
session.addInput(input)
session.addOutput(output)
//设置扫码支持的编码格式(如下设置条形码和二维码兼容)
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]
let layer = AVCaptureVideoPreviewLayer.init(session: session)
layer.videoGravity = AVLayerVideoGravityResizeAspectFill
layer.frame=self.view.layer.bounds
self.view.layer.insertSublayer(layer, atIndex: 0)
//开始捕获
session.startRunning()
实现代理
首先继承代理协议class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate
接下来实现代理方法,处理获得的数据
///捕捉识别到的信息
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
if metadataObjects.count>0 {
//session.stopRunning()
let metadataObject = metadataObjects[0]
//输出扫描字符串
resultLabel.text = metadataObject.stringValue
}
}