iOS中二维码,条形码等的扫描

二维码扫描用到的类

(1)AVCaptureDevice输入的设备
(2)AVCaptureInput输入流
(3)AVCaptureMetadataOutput输出流
(4)AVCaptureSession,是个管理工具,管理输入输出流AVCaptureInput,AVCaptureMetadataOutput,执行输入设备和输出设备之间的数据传递
(5)AVCaptureVideopreviewLayer 镜头捕捉到的预览图层

这些类的使用:
(1)设备AVCaptureDevice *device = [AVCapture defaultDeviceWithMediaType:AVMediaTypeVideo];
(2)输入流
NSError *error;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if(!input){
NSLog(@”出错了%@”,[error localizedDescription]);
}

(3)输出流
AVCaptureMetadataOutput *output = [AVCaptureMetadataOutput alloc]init];

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

rectOfInterest是用来限制可用扫描区域的,官方文档上的解释为A rectangle of interest for limiting the search area for visual metadata.关于它的值的设置不同于其他的rect值,是想法的比例关系,取值范围在(0,1)之间
output.rectOfInterest = CGRectMake(扫描的区域的y / 屏幕高度,扫描区域的x/屏幕的宽度,扫描区域的高度/屏幕的高度,扫描区域的宽度/屏幕的宽度);

设置扫码支持的码类型
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode,AVMetadataObjectEan8Code,AVMetadataObjectTypeCode128Code]];

(4)创建管理者AVCaptureSession
AVCaptureSession *session = [[AVCaptureSession alloc]init];
if([session canAddInput:input]){
[session addInput:input];
}
if([session canAddOutput:output]]){
[session addOutput:output];
}
[session setSessionPreset:AVCaptureSessionPresetHigh];
(4)输出对象
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
layer.frame = self.view.layer.bounds;
[self.view.layer insertSublayer:layer atIndex:0];

(5)session开始工作
[session startRunning];

(6)AVCaptureMetadataOutputObjectsDelegate
-(void)captureOutput:(AVCaptureOutput )captureOutput didOutputMetadataObjects:(NSArray )metadataObjects fromConnection:(AVCaptureConnection *)connection{
if(metadataObjects != nil && metadataObjects.count > 0){
AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
NSString *result ;
if([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]){
result = metadataObj.stringValue;
NSLog(@”%@”,result)
}else{
NSLog(@”不是二维码”);
}
//拿到结果去处理
[self performSelectorOnMainThread:@selector(reportScanResult:) withObject:result waitUntilDone:NO];
}
}

//处理结果
- (void)reportScanResult:(NSString *)result{
[session stopRuning];
session = nil;
……
}
//如果想要一个横线上下滑动
创建view,定时器改变view的frame的y,记得在viewWillDisappear的时候invalidate定时器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值