zoukankan      html  css  js  c++  java
  • iOS扫描二维码(系统方法)

     步骤如下:

     1.导入AVFoundation框架,引入<AVFoundation/AVFoundation.h>

     2.设置一个用于显示扫描的view

     3.实例化AVCaptureSessionAVCaptureVideoPreviewLayer

     

    @property (weak, nonatomic) IBOutlet UIView *viewPreView;
    //捕捉会话
    @property (nonatomic, strong) AVCaptureSession *captureSession;
    //展示layer
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;
    
     _captureSession = nil;
      [self startReading];
    

    开始扫描

    - (BOOL)startReading {
        NSError *error;
        
        //1.初始化捕捉设备(AVCaptureDevice),类型为AVMediaTypeVideo
        AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        
        //2.用captureDevice创建输入流
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
        if (!input) {
            NSLog(@"%@", [error localizedDescription]);
            return NO;
        }
        
        //3.创建媒体数据输出流
        AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
        
        //4.实例化捕捉会话
        _captureSession = [[AVCaptureSession alloc] init];
        
        //4.1.将输入流添加到会话
        [_captureSession addInput:input];
        
        //4.2.将媒体输出流添加到会话中
        [_captureSession addOutput:captureMetadataOutput];
        
        //5.创建串行队列,并加媒体输出流添加到队列当中
        dispatch_queue_t dispatchQueue;
        dispatchQueue = dispatch_queue_create("myQueue", NULL);
        //5.1.设置代理
        [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
        
        //5.2.设置输出媒体数据类型为QRCode
        [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
        
        //6.实例化预览图层
        _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
        
        //7.设置预览图层填充方式
        [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        
        //8.设置图层的frame
        [_videoPreviewLayer setFrame:_viewPreView.layer.bounds];
        
        //9.将图层添加到预览view的图层上
        [_viewPreView.layer addSublayer:_videoPreviewLayer];
        
        //10.设置扫描范围
        captureMetadataOutput.rectOfInterest = CGRectMake(0.2f, 0.2f, 0.8f, 0.8f);
        
        
        //11.开始扫描
        [_captureSession startRunning];
        
        
        return YES;
    }
    

    AVCaptureMetadataOutputObjectsDelegate

    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        NSString * stringValue;
        //判断是否有数据
        if (metadataObjects != nil && [metadataObjects count] > 0) {
            AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
            stringValue = metadataObj.stringValue;
        }
        NSLog(@"%@",stringValue);
        [_captureSession stopRunning];
    }
    

      

    来源: http://www.cnblogs.com/spaceID/p/4994443.html

      

  • 相关阅读:
    About
    Git
    SQL
    fiddler
    Windows下----nvm的安装操作
    vs-code 的常用插件
    npm安装依赖时-S和-D的作用以及区别
    Node.js的安装以及包的安装使用
    JavaScript-----设计模式
    JavaScript-----JS的深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/spaceID/p/4994443.html
Copyright © 2011-2022 走看看