iOS 扫描二维码

2016-06-24  本文已影响131人  ShanJiJi


#import "QRCodeScanViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface QRCodeScanViewController () <AVCaptureMetadataOutputObjectsDelegate>

// 使用扫描二维码, 需要导入框架  <AVFoundation/AVFoundation.h>
// 手机震动, 需要导入框架       <AudioToolbox/AudioToolbox.h>
/**
 *      输入输出流管道(控制输入输出流)
 */
@property (nonatomic, strong) AVCaptureSession *session;
/**
 *      显示捕获到的相机输出流
 */
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *preLayer;
/**
 *      获取摄像设备
 */
@property (nonatomic, strong) AVCaptureDevice *device;
/**
 *      创建输入流
 */
@property (nonatomic, strong) AVCaptureDeviceInput *input;
/**
 *      创建输出流
 */
@property (nonatomic, strong) AVCaptureMetadataOutput *output;

@end

@implementation QRCodeScanViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    // 开始扫描二维码
    [self startScan];
    // 点击返回主界面
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(dismissMainView)];
    [self.view addGestureRecognizer: tap];
}

- (void) dealloc {
    // 视图消失, 关闭通道
    [self.session stopRunning];
}

- (void) dismissMainView {
    [self dismissViewControllerAnimated: YES completion: nil];
}
// 开始扫描二维码
- (void) startScan {
    // 获取摄像设备
    self.device = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];
    // 创建输入流
    NSError *error = nil;
    self.input = [AVCaptureDeviceInput deviceInputWithDevice: self.device error: &error];
    if (error) {
        NSLog(@"input error: %@", error);
    }
    // 创建输出流
    self.output = [AVCaptureMetadataOutput new];
    // 设置代理, 在主线程中刷新
    [self.output setMetadataObjectsDelegate:self queue: dispatch_get_main_queue()];
    // 初始化连接对象
    self.session = [AVCaptureSession new];
    // 设置高质量采集率
    [self.session setSessionPreset: AVCaptureSessionPresetHigh];
    // 输入输出流加入到会话中
    [self.session addInput: self.input];
    [self.session addOutput: self.output];
    // 设置扫描支持的编码格式
    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];
    // 设置扫描layer
    self.preLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.session];
    self.preLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    CGSize windowSize = [UIScreen mainScreen].bounds.size;
    self.preLayer.frame = CGRectMake((windowSize.width - 160)/4, windowSize.height/6 - 30, windowSize.width/2 + 80 , windowSize.height/2);
    [self.view.layer insertSublayer: self.preLayer atIndex:0];
    self.preLayer.cornerRadius = 10;
    self.preLayer.borderColor = [UIColor orangeColor].CGColor; ;
    self.preLayer.borderWidth = 3;
    // 启动管道, 开始捕获
    [self.session startRunning];
}

#pragma mark - AVCaptureMetadataOutputObjectsDelegate

// 扫描二维码
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    // 判断是否存在数据
    if (metadataObjects.count > 0) {
        AVMetadataMachineReadableCodeObject *obj = [metadataObjects lastObject];
        // 二维码扫描信息处理
        NSLog(@"obj --%@", obj);
NSLog(@"obj.corners = %@",obj.corners);
        NSLog(@"obj.stringValue = %@",obj.stringValue);
        
        NSString *string = [NSString stringWithFormat:@"%@",obj.stringValue];
        NSLog(@"扫码结果:%@",string);
    }
}



上一篇下一篇

猜你喜欢

热点阅读