苹果公司升级到IOS7后自己的PassBook自带二维码扫描功能,所以现在使用二维码功能不需要在借助第三方库了

使用前请先导入AVFoundation.frameWork

//

//  YHQViewController.m

//  ReadQRCode

//

//  Created by apple on 13-12-22.

//  Copyright (c) 2013年 apple. All rights reserved.

//

#import "YHQViewController.h"

#import <AVFoundation/AVFoundation.h>

@interfaceYHQViewController ()<AVCaptureMetadataOutputObjectsDelegate>

// IBOutletUILabel *captureLabe是自己建立的storyBoard中的Label用于显示获取到的二维码的信息的连线

@property (weak, nonatomic) IBOutletUILabel *captureLabel;

@property(strong,nonatomic) AVCaptureSession *session; // 二维码生成的绘画

@property(strong,nonatomic)  AVCaptureVideoPreviewLayer *previewLayer;  // 二维码生成的屠城

@end

@implementation YHQViewController

- (void)viewDidLoad

{

[superviewDidLoad];

}

#pragma mark - 读取二维码

- (void)readQRcode

{

// 1. 摄像头设备

AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

// 2. 设置输入

// 因为模拟器是没有摄像头的,因此在此最好做一个判断

NSError *error = nil;

AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:device error:&error];

if (error) {

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

return;

}

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

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc] init];

// 3.1 设置输出的代理

// 说明:使用主线程队列,相应比较同步,使用其他队列,相应不同步,容易让用户产生不好的体验

[output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];

//    [output setMetadataObjectsDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];

// 4. 拍摄会话

AVCaptureSession *session = [[AVCaptureSessionalloc] init];

// 添加session的输入和输出

[session addInput:input];

[session addOutput:output];

// 4.1 设置输出的格式

// 提示:一定要先设置会话的输出为output之后,再指定输出的元数据类型!

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

// 5. 设置预览图层(用来让用户能够看到扫描情况)

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayerlayerWithSession:session];

// 5.1 设置preview图层的属性

[preview setVideoGravity:AVLayerVideoGravityResizeAspectFill];

// 5.2 设置preview图层的大小

[preview setFrame:self.view.bounds];

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

[self.view.layerinsertSublayer:preview atIndex:0];

self.previewLayer = preview;

// 6. 启动会话

[session startRunning];

self.session = session;

}

#pragma mark - 输出代理方法

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

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

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

{

// 会频繁的扫描,调用代理方法

// 1. 如果扫描完成,停止会话

[self.sessionstopRunning];

// 2. 删除预览图层

[self.previewLayerremoveFromSuperlayer];

NSLog(@"%@", metadataObjects);

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

if (metadataObjects.count > 0) {

AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!

_captureLabel.text = obj.stringValue;

}

}

// 在storyBoard中添加的按钮的连线的点击事件,一点击按钮就提示用户打开摄像头并扫描

- (IBAction)capture {

//扫描二维码

[selfreadQRcode];

}

@end

最新文章

  1. arcmap配置的mxd慢的问题
  2. 小例子(二)、winform窗体间的关系
  3. C#委托和事件讲解
  4. Linux 性能监测工具总结
  5. connect network is unreachable 解决办法
  6. Swift语言教程中文文档
  7. java实现UDP聊天---转载
  8. 对VC++6.0爱得深沉(一)安装vc++6.0,支持winXP,win7,win8.1,win10
  9. TPFrame框架之robot模块的基本使用
  10. 记录一次tomcat下项目没有加载成功
  11. Linux指令--ping
  12. Python判断自定义的参数格式是否正确
  13. 高性能JavaScript(1)
  14. Linux并发与同步专题 (3) 信号量
  15. [SDOI2013] 直径
  16. mysql的事件
  17. Js下载文件到本地(兼容多浏览器)
  18. macos版本mojave 安装postgres报错
  19. TCP协议和UDP协议区别
  20. xcode配置文件中,Architectures表示的意义

热门文章

  1. 基于最简单的FFmpeg包封过程:视频和音频分配器启动(demuxer-simple)
  2. linux内核之网络协议栈
  3. 五子棋Web版的开发(一)---搭建IDEA SSH环境
  4. 关于playframework2.5
  5. IE 弹出框处理经验
  6. 我的Python成长之路---第一天---Python基础(4)---2015年12月26日(雾霾)
  7. flex正则表达式
  8. Qtwebkit配置,设置交叉编译环境 - croop520的专栏 - 博客频道 - CSDN.NET
  9. golang实现tcp接入服务器
  10. 非常可乐(bfs)