zoukankan      html  css  js  c++  java
  • iOS二维码扫描

    测试环境:iPhone 5s  iOS7.1

    首先添加框架AVFoundation.framework,然后导入自定义类CMCaptureViewController.h、CMCaptureViewController.m,以及用到的图片资源:line@2x.png、pick_bg@2x.png。

    用的时候只需要切换到二维码视图控制器CMCaptureViewController即可,会跳到二维码扫描界面

    如:

    1 [self presentViewController:captureViewController animated:YES completion:nil];

    要获得扫描的二维码内容,只需要成为 其委托,实现委托方法

    1 - (void)captureController:(CMCaptureViewController *)controller data:(id)metadata;

    参数metadata中包含扫描到的字符串。

    CMCaptureViewController.h、CMCaptureViewController.m的源代码如下:

     1 //  CMCaptureViewController.h
     2 //  二维码扫描
     3 
     4 #import <UIKit/UIKit.h>
     5 #import <AVFoundation/AVFoundation.h>
     6 
     7 @class CMCaptureViewController;
     8 @protocol CMCaptureViewDelegate <NSObject>
     9 
    10 - (void)captureController:(CMCaptureViewController *)controller data:(id)metadata;
    11 
    12 @end
    13 
    14 @interface CMCaptureViewController : UIViewController<AVCaptureMetadataOutputObjectsDelegate>
    15 {
    16     int num;
    17     BOOL upOrdown;
    18     NSTimer * timer;
    19 }
    20 @property (strong,nonatomic)AVCaptureDevice * device;
    21 @property (strong,nonatomic)AVCaptureDeviceInput * input;
    22 @property (strong,nonatomic)AVCaptureMetadataOutput * output;
    23 @property (strong,nonatomic)AVCaptureSession * session;
    24 @property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview;
    25 @property (nonatomic, retain) UIImageView * line;
    26 @property (nonatomic, weak) id <CMCaptureViewDelegate> delegate;
    27 
    28 @end
      1 //  CMCaptureViewController.m
      2 //  二维码扫描
      3 
      4 
      5 #import "CMCaptureViewController.h"
      6 
      7 @interface CMCaptureViewController ()
      8 
      9 @end
     10 
     11 @implementation CMCaptureViewController
     12 
     13 - (void)loadView
     14 {
     15     [super loadView];
     16     self.view.backgroundColor = [UIColor redColor];
     17     UIButton * scanButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
     18     [scanButton setTitle:@"取消" forState:UIControlStateNormal];
     19     scanButton.frame = CGRectMake(100, 420, 120, 40);
     20     [scanButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
     21     [self.view addSubview:scanButton];
     22     
     23     UILabel * labIntroudction= [[UILabel alloc] initWithFrame:CGRectMake(15, 40, 290, 50)];
     24     labIntroudction.backgroundColor = [UIColor clearColor];
     25     labIntroudction.numberOfLines=2;
     26     labIntroudction.textColor=[UIColor whiteColor];
     27     labIntroudction.text=@"将二维码图像置于矩形方框内,离手机摄像头10CM左右,系统会自动识别。";
     28     [self.view addSubview:labIntroudction];
     29     
     30     
     31     UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 100, 300, 300)];
     32     imageView.image = [UIImage imageNamed:@"pick_bg"];
     33     [self.view addSubview:imageView];
     34     
     35     upOrdown = NO;
     36     num =0;
     37     _line = [[UIImageView alloc] initWithFrame:CGRectMake(50, 110, 220, 2)];
     38     _line.image = [UIImage imageNamed:@"line.png"];
     39     [self.view addSubview:_line];
     40     
     41     timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES];
     42 
     43 }
     44 
     45 
     46 -(void)animation1
     47 {
     48     if (upOrdown == NO) {
     49         num ++;
     50         _line.frame = CGRectMake(50, 110+2*num, 220, 2);
     51         if (2*num == 280) {
     52             upOrdown = YES;
     53         }
     54     }
     55     else {
     56         num --;
     57         _line.frame = CGRectMake(50, 110+2*num, 220, 2);
     58         if (num == 0) {
     59             upOrdown = NO;
     60         }
     61     }
     62 
     63 }
     64 
     65 -(void)backAction
     66 {
     67     
     68     [self dismissViewControllerAnimated:YES completion:^{
     69         [timer invalidate];
     70     }];
     71 }
     72 
     73 
     74 
     75 -(void)viewWillAppear:(BOOL)animated
     76 {
     77     [self setupCamera];
     78 }
     79 - (void)setupCamera
     80 {
     81     // Device
     82     _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
     83 
     84     // Input
     85     _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
     86     
     87     // Output
     88     _output = [[AVCaptureMetadataOutput alloc]init];
     89     [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
     90     
     91     // Session
     92     _session = [[AVCaptureSession alloc]init];
     93     [_session setSessionPreset:AVCaptureSessionPresetHigh];
     94     if ([_session canAddInput:self.input])
     95     {
     96         [_session addInput:self.input];
     97     }
     98     
     99     if ([_session canAddOutput:self.output])
    100     {
    101         [_session addOutput:self.output];
    102     }
    103     
    104     // 条码类型 AVMetadataObjectTypeQRCode
    105     _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];
    106     
    107     // Preview
    108     _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
    109     _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    110     _preview.frame =CGRectMake(20,110,280,280);
    111     [self.view.layer insertSublayer:self.preview atIndex:0];
    112     
    113     // Start
    114     [_session startRunning];
    115 }
    116 #pragma mark AVCaptureMetadataOutputObjectsDelegate
    117 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    118 {
    119    
    120     NSString *stringValue;
    121     
    122     if ([metadataObjects count] >0)
    123     {
    124         AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
    125         stringValue = metadataObject.stringValue;
    126         NSLog(@"[%@]", stringValue);
    127     }
    128     
    129     [_session stopRunning];
    130 
    131     [self dismissViewControllerAnimated:YES completion:^
    132     {
    133         [timer invalidate];
    134         
    135         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    136             if ([self.delegate respondsToSelector:@selector(captureController:data:)])
    137             {
    138                 [self.delegate captureController:self data:stringValue];
    139             }
    140         });
    141 
    142     }];
    143 }
    144 
    145 - (void)didReceiveMemoryWarning
    146 {
    147     [super didReceiveMemoryWarning];
    148     // Dispose of any resources that can be recreated.
    149 }
    150 
    151 
    152 
    153 @end

    pick_bg@2x.png

    line@2x.png

  • 相关阅读:
    第四周学习总结
    第十三周编程总结
    2018秋季第十三周助教总结
    第十三周学习总结
    使用函数输出水仙花数 (void的用法)
    ZOJ3229 有源汇上下界最大流
    codeforces-1176 (div3)
    codeforces-1077 (div3)
    牛客假日团队赛1 题解
    牛客练习赛38 离线 启发式合并并查集
  • 原文地址:https://www.cnblogs.com/cmembd/p/4017642.html
Copyright © 2011-2022 走看看