码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 系统二维码扫描(可限制扫描区域)

时间:2015-10-14 23:36:52      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

   使用 AVFoundation系统库来进行二维码扫描并且限制扫描二维码的范围。(因为默认的是全屏扫描)

   

-(void)beginCode

{

    //1.摄像头设备

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    

    /*

     // Media types

     

     AVMediaTypeVideo

     AVMediaTypeAudio

     AVMediaTypeText

     AVMediaTypeClosedCaption

     AVMediaTypeSubtitle

     AVMediaTypeTimecode

     AVMediaTypeMetadata

     AVMediaTypeMuxed

     */

    

    //2.设置输入

    /**

     *  设置输入  此方法需要判断 因为模拟器没有摄像头

     *

     *  @param  把摄像头作为输入的设备

     *

     *  @return 返回AVCaptureInput

     */

    NSError *error = nil;

    AVCaptureInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

    if (error) {

        NSLog(@"没有摄像头%@",error);

        return;

    }

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

    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

    //3.1输出的代理 捕获二维码的图像

    //dispatch_get_main_queue()使用主线程队列,响应比较同步,使用其他队列响应不同步。

    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    //3.2 设置扫描区域  默认是全屏扫描

//这个CGRectMake(Y,X,H,W) 1代表最大值    原点是导航右下角 为起始点

//    [output setRectOfInterest:CGRectMake(0, 0.5, 0.5, 0.5)];//左上角 1/4 屏幕

//    [output setRectOfInterest:CGRectMake(0.5, 0.5, 0.5, 0.5)];//左下角 1/4 屏幕

//    [output setRectOfInterest:CGRectMake(0.5, 0, 0.5, 0.5)]; //右下角 1/4 屏幕

//    [output setRectOfInterest:CGRectMake(0, 0, 0.5, 0.5)]; //右上角 1/4 屏幕

//     [output setRectOfInterest:CGRectMake((124)/ScreenHigh,          ((ScreenWidth220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)]; //设置自定义像素点的 位置

    [output setRectOfInterest:CGRectMake(0.25,0.25, 0.5, 0.5)]; //貌似 中间的感觉!!!

    //4.拍摄会话

    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    _session = session;

    //添加session的输入和输出

    [session addInput:input];

    [session addOutput:output];

    

    //4.1设置输出的格式

    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    

    //5.设置预览图层 (让用户看到扫描结果)

    AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];

    _previewLayer = preview;

    //5.1设置preview的属性

    preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

    //5.2设置preview的图层的大小

    [preview setFrame:self.view.bounds];

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

    [self.view.layer insertSublayer:preview atIndex:0];

    

    //6.启动会话

    [session startRunning];

}

 

 

 

#pragma mark 输出的代理方法

//此方法是在识别到QRCode,并且完成转换

//如果QRCode的内容越大,转换需要的时间就越长

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

    //会频繁的扫描

    //如果扫描完成就停止

    [_session stopRunning];

    //删除预览的图层

    [_previewLayer removeFromSuperlayer];

    

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

    NSString *reslutStr = [[NSString alloc] init];

    if (metadataObjects.count > 0) {

        AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

        reslutStr = [obj stringValue];//这个就是 扫描的结果

        //如果需要对URL 名片 等信息进行扫描 再次进行扩展

    }

    NSLog(@"%@",metadataObjects);

}

 

iOS 系统二维码扫描(可限制扫描区域)

标签:

原文地址:http://www.cnblogs.com/zhaozhongpeng/p/4878958.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!