IOS 控件 - Swift 集成 IOS 自带 API 扫描二维码

第一步:加入框架 AVFoundation.framework

目录选择 targets -> Build Phases -> Link Binary with Libraries 后,加入AVFoundation.framework即可

第二步:加入以下代码,并加入协议 AVCaptureMetadataOutputObjectsDelegate,

定义全局变量

var session: AVCaptureSession?;  

var previewLayer: AVCaptureVideoPreviewLayer?;  

在需要使用的地方 使用readQRCode()函数即可

func readQRCode() {

        

        //1.获取摄像头设备

        var device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo);

        

        //2.设置输入

        var error: NSError?;

        var input: AVCaptureDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as AVCaptureDeviceInput;

        if (error != nil) {

            println("没有摄像头\(error?.localizedDescription)");

            return;

        }

        

        // 3. 设置输出(Metadata元数据)

        var output: AVCaptureMetadataOutput = AVCaptureMetadataOutput();

        // 3.1 设置输出的代理

        // 说明:使用主线程队列,相应比较同步,使用其他队列,相应不同步,容易让用户产生不好的体验

        output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue());

        

        // 4. 拍摄会话

        var session1: AVCaptureSession = AVCaptureSession();

        session1.addInput(input);

        session1.addOutput(output);

        

        // 4.1 设置输出的格式

        // 提示:一定要先设置会话的输出为output之后,再指定输出的元数据类型!

        output.metadataObjectTypes = [AVMetadataObjectTypeQRCode];

        

        // 5. 设置预览图层(用来让用户能够看到扫描情况)

        var preview: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session1) as AVCaptureVideoPreviewLayer;

        // 5.1 设置preview图层的属性

        preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

        // 5.2 设置preview图层的大小

        preview.frame = self.view.bounds;

        // 5.3 将图层添加到视图的图层

        self.view.layer.insertSublayer(preview, atIndex: 0);

        self.previewLayer = preview;

        

        // 6. 启动会话

        session1.startRunning();

        

        self.session = session1;

    }

    

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

        // 会频繁的扫描,调用代理方法

        // 1. 如果扫描完成,停止会话

        self.session?.stopRunning();

        // 2. 删除预览图层

        self.previewLayer?.removeFromSuperlayer();

        

        println(metadataObjects);

        // 3. 设置界面显示扫描结果

        

        if (metadataObjects.count > 0) {

            var obj:AVMetadataMachineReadableCodeObject = metadataObjects[0] as AVMetadataMachineReadableCodeObject;

            // 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!

            println("结果如下:" + obj.stringValue);

        }

    }

 

你可能感兴趣的:(swift)