• iOS QRCode(二维码)


    实现思路

    1. 输入设备(用来获取外界信息) 摄像头, 麦克风, 键盘
    2. 输出设备 (将收集到的信息, 做解析, 来获取收到的内容)
    3. 会话session (用来连接输入和输出设备)
    4. 特殊的layer (展示输入设备所采集的信息)

    1. 导包

    #import <AVFoundation/AVFoundation.h>
    

    2. 代码

    #import "ViewController.h"
    #import <AVFoundation/AVFoundation.h>
    
    @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
    //1. 输入设备(用来获取外界信息)  摄像头, 麦克风, 键盘
    @property (nonatomic, strong) AVCaptureDeviceInput *input;
    //2. 输出设备 (将收集到的信息, 做解析, 来获取收到的内容)
    @property (nonatomic, strong) AVCaptureMetadataOutput *output;
    //3. 会话session (用来连接输入和输出设备)
    @property (nonatomic, strong) AVCaptureSession *session;
    //4. 特殊的layer (展示输入设备所采集的信息)
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
    @end
    
    @implementation ViewController
    
    #pragma mark 点击屏幕开始扫描
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //1.输入设备(用来获取外界信息)  摄像头, 麦克风, 键盘
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        self.input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
        
        //2.输出设备 (将收集到的信息, 做解析, 来获取收到的内容)
        self.output = [AVCaptureMetadataOutput new];
        
        //3.会话session (用来连接输入和输出设备)
        self.session = [AVCaptureSession new];
        
        // 会话扫描展示的大小
        [self.session setSessionPreset:AVCaptureSessionPresetHigh];
        
        // 会话跟输入和输出设备关联
        if ([self.session canAddInput:self.input]) {
            [self.session addInput:self.input];
        }
        if ([self.session canAddOutput:self.output]) {
             [self.session addOutput:self.output];
        }
        
        //下面两句代码应该写在此处
        //制定输出设备的代理, 用来接受返回的数据
        [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        
        //设置元数据类型 二维码QRCode
        [self.output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
        
        //4.特殊的layer (展示输入设备所采集的信息)
        self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];
        // 大小layer的大小
        self.previewLayer.frame = self.view.bounds;
        [self.view.layer addSublayer:self.previewLayer];
        
        //5. 启动会话
        [self.session startRunning];
    }
    
    /**
     captureOutput : 输出设备
     metadataObjects : 元数据对象的数组
     connection : 连接
     */
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        //1. 停止会话
        [self.session stopRunning];
        
        //2. 删除layer
        [self.previewLayer removeFromSuperlayer];
        
        //3. 遍历数据获取内容
        for (AVMetadataMachineReadableCodeObject *obj in metadataObjects) {
            NSLog(@"obj: %@",obj.stringValue);
        }
    }
    
    @end
    
  • 相关阅读:
    python基础学习8(浅拷贝与深拷贝)
    适配器模式(Adapter)
    NHibernate的调试技巧和Log4Net配置
    查看表字段的相关的系统信息
    Asp.net MVC 3 开发一个简单的企业网站系统
    ie8 自动设置 兼容性 代码
    同时安装vs2010和VS2012后IEnumerable<ModelClientValidationRule>编译错误
    各种合同样本
    使用远程桌面的朋友可能经常会遇到“超出最大允许连接数”的问题,
    弹出窗口全屏显示:window.showModalDialog与window.open全屏显示
  • 原文地址:https://www.cnblogs.com/twodog/p/12137644.html
Copyright © 2020-2023  润新知