zoukankan      html  css  js  c++  java
  • IOS 控件

    第一步:加入框架 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);
            }
        }
  • 相关阅读:
    装饰器详解
    面试题求 平衡点
    Python面试题
    With语句上下文管理
    多个装饰器修饰一个函数
    NGINX部署配置参考.
    Django ORM操作
    MYsql 之多表查询.
    [数据结构与算法] : 二叉查找树
    [数据结构与算法] : 队列
  • 原文地址:https://www.cnblogs.com/ziyeSky/p/4138053.html
Copyright © 2011-2022 走看看