iOS自带原生二维码扫描的实现

所属分类: 软件编程 / IOS 阅读数: 1599
收藏 0 赞 0 分享

前言

首先说明的是:原生的二维码扫描有一个坑,那就是扫描范围的确定。只要记得扫描范围是X与Y互换位置,W与H互换位置,就没有什么问题了。

下面进入正题:

1.因为使用原生二维码扫描,所以需要加入头文件添加delegate

#import <AVFoundation/AVFoundation.h>
<AVCaptureMetadataOutputObjectsDelegate>

2.接着是使用到的类

@property (strong,nonatomic)AVCaptureDevice * device;
@property (strong,nonatomic)AVCaptureDeviceInput * input;
@property (strong,nonatomic)AVCaptureMetadataOutput * output;
@property (strong,nonatomic)AVCaptureSession * session;
@property (weak, nonatomic) IBOutlet UIView *outputView;//xib中扫描的View
@property (strong,nonatomic)AVCaptureVideoPreviewLayer * preview;
@property (strong, nonatomic) NSTimer * timer;//为了做扫描动画的定时器
@property (strong, nonatomic) UIImageView * lineImage;//扫描动画的横线

3.懒加载一个扫描动画的图片

-(UIImageView *)lineImage{
 if (!_lineImage) {
  CGFloat outputW = self.outputView.frame.size.width;
  _lineImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0,outputW, 2)];
  _lineImage.image = [UIImage imageNamed:@"ray"];
 }
 return _lineImage;
}

4.使用前的设置,我将它设置在了viewDidLoad当中

-viewDidLoad{
[super viewDidLoad];
 // Device
 _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

 // Input
 _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

 // Output
 _output = [[AVCaptureMetadataOutput alloc]init];
 [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

 // Session
 _session = [[AVCaptureSession alloc]init];
 [_session setSessionPreset:AVCaptureSessionPresetHigh];
 //连接输入和输出
 if ([_session canAddInput:self.input])
 {
  [_session addInput:self.input];
 }

 if ([_session canAddOutput:self.output])
 {
  [_session addOutput:self.output];
 }
//设置条码类型
 _output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode];

 //设置条码位置
 CGFloat X = (ScreenW/2-100)/ScreenW;
 CGFloat Y = (ScreenH/2-100)/ScreenH;
 CGFloat W = 200/ScreenW;
 CGFloat H = 200/ScreenH;
 //设置扫描范围(注意,X与Y交互,W与H交换)
 [_output setRectOfInterest:CGRectMake(Y, X, H, W)];
//添加扫描画面
 _preview =[AVCaptureVideoPreviewLayer layerWithSession:_session];
 _preview.videoGravity =AVLayerVideoGravityResizeAspectFill;
 _preview.frame = CGRectMake(0, 0, ScreenW, ScreenH);//self.view.layer.bounds;
 [self.view.layer insertSublayer:_preview atIndex:0];
 //开始扫描
 [_session startRunning];

//添加扫描动画定时器
[self.outputView addSubview:self.lineImage];
 // Do any additional setup after loading the view from its nib.
 _timer = [NSTimer scheduledTimerWithTimeInterval:2.5f
           target:self
           selector:@selector(lineAction)
           userInfo:nil
           repeats:YES];
}

5.二维码扫描的代理事件

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
 NSString *stringValue;
 if ([metadataObjects count] >0){
  //停止扫描
  [_session stopRunning];
  AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
  stringValue = metadataObject.stringValue;//stringValue是扫描拿到的内容,更具内容进行后续工作。
 }
}

6.添加扫描动画的事件

- (void)lineAction{
 CGFloat outputW = self.outputView.frame.size.width;
 CGFloat outputH = self.outputView.frame.size.height;
 [UIView animateWithDuration:2.4f animations:^{
  CGRect frame = CGRectMake(0, outputH, outputW, 2);
  self.lineImage.frame = frame;
 } completion:^(BOOL finished) {
  CGRect frame = CGRectMake(0, 0, outputW, 2);
  self.lineImage.frame = frame;
 }];
}

搞定......最后放上一张效果图

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

更多精彩内容其他人还在看

iOS开发笔记--详解UILabel的相关属性设置

这篇文章主要介绍了iOS开发笔记--详解UILabel的相关属性设置,对初学者具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

iOS中获取系统相册中的图片实例

这篇文章主要介绍了iOS中获取系统相册中的图片实例,具有一定的参考价值没有需要的朋友可以了解一下。
收藏 0 赞 0 分享

iOS 检测网络状态的两种方法

一般有Reachability和AFNetworking监测两种方式,都是第三方的框架,下文逐一详细给大家讲解,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

IOS 性能优化中离屏渲染

本文主要介绍了IOS 性能优化中离屏渲染的资料,提供了几种方法讲解了优化,有需要的小伙伴可以参考下
收藏 0 赞 0 分享

iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P

这篇文章主要介绍了iOS获取当前设备型号设备信息的总结包含iPhone7和iPhone7P,包括ios7之前之后的获取方式,本文接的非常详细,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS实现爆炸的粒子效果示例代码

之前在网上看到了一个Android实现的爆炸效果,感觉非常不错,所以自己尝试用iOS来实现下效果,现在将实现的过程、原理以及遇到的问题分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

iOS毕业设计之天气预报App

这篇文章主要为大家详细介绍了iOS毕业设计之天气预报App,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS轻点、触摸和手势代码开发

这篇文章主要为大家详细介绍了iOS轻点、触摸和手势代码开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

iOS 实现多代理的方法及实例代码

这篇文章主要介绍了iOS 实现多代理的方法及实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

iOS文字渐变色效果的实现方法

在大家日常开发iOS的过程中,可能会遇到要实现文字渐变色的效果,这篇文章文章通过示例代码和详细的步骤介绍了如何利用iOS实现文字渐变色的效果,实现后的很不错,感兴趣的朋友们下面来一起看看吧。
收藏 0 赞 0 分享
查看更多