使用AVFoundation实现条形码及二维码扫描

最近做项目遇到了二维码、条形码扫描的需求,使用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
    }
}

你可能感兴趣的:(ios)