iOS开发之二维码扫描

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
span.s1 { }

二维码扫描

01-导入系统库

02 新建继承自UIView的

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
span.s1 { }

LHQPreView

2.1导入系统库头文件

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c81b13 }
span.s1 { color: #822d0f }
span.s2 { }

#import <AVFoundation/AVFoundation.h>

2.2声明所需要的属性

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c42275 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
span.s1 { }
span.s2 { color: #000000 }
span.s3 { color: #6122ae }

@property(nonatomic,strong)UIImageView *imageView;

@property(nonatomic,strong)UIImageView *lineImageView;

@property(nonatomic,strong)NSTimer *timer;

@property(nonatomic,strong)AVCaptureSession *session;

2.3返回layer的类型

//可以展示输入设备展示的信息

+(Class)layerClass{

return [AVCaptureVideoPreviewLayer class];

}

2.4 设置特殊的layer

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px }
span.s1 { }
span.s2 { color: #c42275 }
span.s3 { color: #6122ae }
span.s4 { color: #539aa4 }
span.s5 { color: #000000 }
span.s6 { color: #703daa }

- (void)setSession:(AVCaptureSession *)session{

_session = session;

AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)self.layer;

layer.session = session;

}

2.5 初始化调用方法实现layer上展示扫描横线的动画

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c42275 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #539aa4 }
span.s1 { }
span.s2 { color: #c42275 }
span.s3 { color: #703daa }
span.s4 { color: #3e1e81 }
span.s5 { color: #294c50 }
span.s6 { color: #000000 }
span.s7 { font: 18.0px "PingFang SC" }
span.s8 { color: #539aa4 }
span.s9 { color: #6122ae }
span.s10 { color: #c81b13 }
span.s11 { font: 18.0px Menlo; color: #000000 }
span.s12 { font: 18.0px Menlo }
span.s13 { color: #0435ff }

- (instancetype)initWithFrame:(CGRect)frame{

if(self = [super initWithFrame:frame]){

[self initUiConfig];

}

return self;

}

- (void)initUiConfig

{

//设置背景图片

_imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pick_bg.png"]];

//设置位置到界面的中间

_imageView.frame = CGRectMake(self.bounds.size.width * 0.5 - 140, self.bounds.size.height * 0.5 - 140, 280, 280);

//添加到视图上

[self addSubview:_imageView];

//初始化二维码的扫描线的位置

_lineImageView = [[UIImageView alloc] initWithFrame:CGRectMake(30, 10, 220, 2)];

_lineImageView.image = [UIImage imageNamed:@"line.png"];

[_imageView addSubview:_lineImageView];

//开启定时器

_timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(animation) userInfo:nil repeats:YES];

}

- (void)animation

{

[UIView animateWithDuration:2.8 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

_lineImageView.frame = CGRectMake(30, 260, 220, 2);

} completion:^(BOOL finished) {

_lineImageView.frame = CGRectMake(30, 10, 220, 2);

}];

}

3 主控制器

3.1导入系统库头文件

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c81b13 }
span.s1 { color: #822d0f }
span.s2 { }

#import <AVFoundation/AVFoundation.h>

3.2导入特殊layer的View

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c81b13 }
span.s1 { }

LHQPreView.h

3.3定义所需要的属性

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c42275 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
span.s1 { font: 18.0px Menlo }
span.s2 { }
span.s3 { color: #000000 }
span.s4 { color: #6122ae }
span.s5 { font: 18.0px "PingFang SC" }
span.s6 { color: #3c828b }

//3.3.1. 输入设备(从外界采集信息)

//输入设备有很多种   摄像头  麦克风  键盘

@property(nonatomic,strong)AVCaptureDeviceInput *input;

//3.3.2.输出设备(解析采集来的内容 然后获取数据)Metadata 元数据

@property(nonatomic,strong)AVCaptureMetadataOutput *output;

//3.3.3.会话 session(连接输入和输出进行工作)

@property(nonatomic,strong)AVCaptureSession *session;

//3.3.4 layer 特殊的layer(展示输入设备采集到的信息)

@property(nonatomic,strong)LHQPreView *preView;

3.4 二维码扫描四个步骤

3.4.1

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81 }
span.s1 { font: 18.0px Menlo; color: #000000 }
span.s2 { font: 18.0px Menlo }
span.s3 { }
span.s4 { color: #000000 }
span.s5 { font: 18.0px "PingFang SC" }
span.s6 { color: #3e1e81 }
span.s7 { color: #703daa }
span.s8 { color: #539aa4 }
span.s9 { color: #6122ae }
span.s10 { color: #c42275 }

//1.摄像头 输入设备(从外界采集信息)

//创建具体的设备

//AVMediaTypeAudio 麦克风

//AVMediaTypeVideo 摄像头

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

_input = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];

3.4.2

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae }
span.s1 { font: 18.0px Menlo }
span.s2 { }
span.s3 { color: #000000 }
span.s4 { color: #539aa4 }
span.s5 { color: #3e1e81 }

//2.输出设备(解析采集来的内容 然后获取数据)

_output = [[AVCaptureMetadataOutput alloc]init];

3.4.3

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #539aa4 }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81 }
span.s1 { color: #000000 }
span.s2 { }
span.s3 { font: 18.0px "PingFang SC" }
span.s4 { color: #539aa4 }
span.s5 { color: #3e1e81 }
span.s6 { font: 18.0px Menlo }
span.s7 { font: 18.0px Menlo; color: #000000 }
span.s8 { color: #c42275 }
span.s9 { color: #0435ff }

//3.会话 session(连接输入和输出进行工作)

_session = [[AVCaptureSession alloc]init];

//    会话展示的大小

[_session setSessionPreset:AVCaptureSessionPresetHigh];

//添加输入设备和输出设备

if([_session canAddInput:_input]){

[_session addInput:_input];

}

if([_session canAddOutput:_output]){

[_session addOutput:_output];

}

//指定输出设备的代理 来返回解析到的数据

//    把网址展示,并且跳转做相关的操作

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

//设置元数据类型

//AVMetadataObjectTypeQRCode 二维码类型

[_output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

3.4.5

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
span.s1 { color: #000000 }
span.s2 { }
span.s3 { font: 18.0px "PingFang SC" }
span.s4 { font: 18.0px Menlo; color: #000000 }
span.s5 { font: 18.0px Menlo }
span.s6 { color: #3c828b }
span.s7 { color: #3e1e81 }
span.s8 { color: #c42275 }
span.s9 { color: #703daa }
span.s10 { color: #539aa4 }

//4 layer 特殊的layer(展示输入设备采集到的信息)

//    _previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];

//    //daxiao

//    self.previewLayer.frame = self.view.bounds;

//    //

//    [self.view.layer addSublayer:self.previewLayer];

//创建一个特殊视图,用来展示二维码界面

LHQPreView *preView = [[LHQPreView alloc]initWithFrame:self.view.bounds];

[self.view addSubview:preView];

preView.session = _session;

3.4.6

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81 }
span.s1 { color: #000000 }
span.s2 { }
span.s3 { font: 18.0px "PingFang SC" }
span.s4 { color: #c42275 }
span.s5 { color: #539aa4 }

//5 开启会话

[self.session startRunning];

3.4.7实现代理方法,打印出扫描的结果

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae }
span.s1 { }
span.s2 { font: 18.0px "PingFang SC" }
span.s3 { color: #c42275 }
span.s4 { color: #6122ae }
span.s5 { color: #000000 }
span.s6 { color: #539aa4 }
span.s7 { color: #3e1e81 }
span.s8 { color: #c81b13 }
span.s9 { color: #703daa }

/*

captureOutput       输出

metadataObjects     元数据数组

connection          连接

*/

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

//停止会话

[_session stopRunning];

//移除labyer

[self.preView removeFromSuperview];

for(AVMetadataMachineReadableCodeObject *objc in metadataObjects){

//        NSLog(@"%@",[objc class]);

//AVMetadataMachineReadableCodeObject

NSLog(@"%@",objc.stringValue);

}

}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c81b13 }
span.s1 { color: #822d0f }
span.s2 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #1e9421 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1e9421 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #6122ae }
span.s1 { }
span.s2 { font: 18.0px "PingFang SC" }
span.s3 { font: 18.0px Menlo }
span.s4 { color: #703daa }
span.s5 { color: #000000 }
span.s6 { color: #c42275 }
span.s7 { color: #3e1e81 }

时间: 2024-10-13 11:53:47

iOS开发之二维码扫描的相关文章

iOS之原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIView *vie

iOS AV Foundation 二维码扫描 02 扫码

AVFoundation支持以下一维和二维码的扫描: QR code Aztec EAN13 EAN8 UPC-E PDF417 Code 93 Code 39 Code 39 mode 41 QR code就是我们所熟知的二维码. 打开ViewController.m,添加以下实例变量: AVCaptureMetadataOutput *_metadataOutput; 当从视频帧中检测到元数据时,AVCaptureMetadataOutput会调用应用程序的回调函数.AV Foundatio

iOS:原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI UI效果如图 IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIVi

IOS 开发之 二维码

二维码扫描 可以使用: iOS7系统库, ZBarSDK, ZXing 1. iOS7开始系统提供二维码扫描库 2. 设置依赖库 AVFoundation.framework 3. 包含头文件 -- 包含头文件 #import <AVFoundation/AVFoundation.h> 4. 扫描核心方法 #pragma mark - 读取二维码 - (void)readQRcode 5. 处理扫描结果核心方法 // 此方法是在识别到QRCode,并且完成转换 // 如果QRCode的内容越大

iOS端使用二维码扫描(ZBarSDK)和生成(libqrencode)功能

如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.手机中二维码使用也很广泛,如微信等.正好最近收集总结了下二维码的使用方法 下面介绍一下如何在iOS设备上使用二维码 首先在github上下载ZBar SDK地址https://github.com/bmorton/ZBarSDK 然后将如下的相关类库添加进去 AVFoundation.framwork, CoreMedia.framework, CoreVideo.framework, libiconv.dylib 和libzb

iOS AV Foundation 二维码扫描 04 使用合成语音朗读二维码内容

前一节,我们为程序识别到的二维码提供了可视化的显示,这一节,我们使用合成语音朗读扫描到的二维码的内容. 修改ViewController.m,定义以下实例变量并进行初始化: AVSpeechSynthesizer *_speechSynthesizer; _speechSynthesizer = [[AVSpeechSynthesizer alloc] init]; 初始化语音合成器十分简单.语音合成器会控制对每个语音数据的回放和顺序.初始化完成后,Metadata output将触发语音合成器

iOS开发-二维码

二维码 从ios7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤: 倒入CoreImage框架 通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码职能放数字) 纯文本 名片 URL 二维码的生成 // 1.创建过滤器 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2.恢复默认 [filter setDefaults]; //

iOS AV Foundation 二维码扫描 03 为扫描到的二维码添加可视化效果

上一节,我们已经实现了二维码的扫描,这一节,我们利用元数据的bounds和corners实现一个可视化的扫描效果. bounds定义了包含二维码图像的矩形,corners定义了二维码图像的实际坐标: 当摄像头和二维码图片完全对齐时,bounds和corners就是相同的.但是通常来说,几乎不可能让摄像头和二维码完全对齐. 打开ViewController.m,添加以下实例变量,用于存放所有检测到得二维码,以二维码的内容为索引. NSMutableDictionary *_barcodes; 在v

iOS AV Foundation 二维码扫描 01 使用摄像头

从这一节开始,我们使用AV Foundation制作一个条码(不仅仅是二维码)扫描程序,除了扫描二维码功能外,还具备语音合成和摄像头缩放功能. 创建名为ColloQR的单view应用程序.打开storyboard,禁用sized class.选中view controller,通过editor菜单将其放入navigation controller中.最后修改标题为ColloQR: 使用摄像头 打开ViewController.m,添加import: @import AVFoundation; 在