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

 更新时间:2017年01月12日 15:46:44   作者:Billy_W  
最近项目中需要做一个二维码扫描,虽然有很多二维码扫描的第三方可以用,但是考虑到项目中的需要,所以我放弃了使用三方库,而采用了苹果原生的扫描。下面这篇文章就介绍了iOS自带原生二维码扫描的实现,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

首先说明的是:原生的二维码扫描有一个坑,那就是扫描范围的确定。只要记得扫描范围是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 出现问题POST网络请求状态code:500的解决方法

    IOS 出现问题POST网络请求状态code:500的解决方法

    这篇文章主要介绍了IOS 出现问题POST网络请求状态code:500的解决方法的相关资料,需要的朋友可以参考下
    2017-02-02
  • Swift 共享文件操作小结(iOS 8 +)

    Swift 共享文件操作小结(iOS 8 +)

    本文主要介绍IOS 共享文件,在这里给大家展示实例代码供大家参考,希望能帮助开发IOS的同学
    2016-07-07
  • iOS如何改变UIBarButtonItem的大小详解

    iOS如何改变UIBarButtonItem的大小详解

    这篇文章主要给大家介绍了关于iOS如何改变UIBarButtonItem大小的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • iOS实现动态元素的引导图效果

    iOS实现动态元素的引导图效果

    这篇文章给大家介绍了iOS实现动态元素的引导图效果的步骤,文章给出了示例代码介绍的很详细,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09
  • IOS设置UIView的边框为圆角详解及实例

    IOS设置UIView的边框为圆角详解及实例

    这篇文章主要介绍了IOS设置UIView的边框为圆角的相关资料,需要的朋友可以参考下
    2017-03-03
  • iOS从App跳转至系统设置菜单各功能项的编写方法讲解

    iOS从App跳转至系统设置菜单各功能项的编写方法讲解

    这篇文章主要介绍了iOS从App跳转至系统设置菜单各功能项的编写方法讲解,示例代码为传统的Objective-C,需要的朋友可以参考下
    2016-04-04
  • iOS 9无法访问HTTP的解决方法

    iOS 9无法访问HTTP的解决方法

    这篇文章主要为大家详细介绍了iOS 9无法访问HTTP的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • IOS 缓存文件的清除实现代码

    IOS 缓存文件的清除实现代码

    这篇文章主要介绍了IOS 缓存文件的清除的相关资料,详细说明了如何获取缓存文件,及缓存文件的清除步骤,需要的朋友可以参考下
    2016-10-10
  • 关于适配iOS11和iPhoneX的一些事

    关于适配iOS11和iPhoneX的一些事

    随着iOS11和xcode9刚开始正式发布,小编也迫不及待的更新了xcode9,手机也顺利更新到iOS,也终于见到iPhone X 的真面,怎么适配是个问题,下面这篇文章主要给大家介绍了关于适配iOS11和iPhoneX的一些事,需要的朋友可以参考下。
    2017-10-10
  • iOS实现百度外卖头像波浪的效果

    iOS实现百度外卖头像波浪的效果

    对于现在很多人来说,叫外卖就成了不可或缺的习惯。某日瞬间发现百度外卖的APP波浪效果很是吸引人,相比较其他的外卖APP,颜值略高些.(淘宝也有波浪的效果),遂就思考如何实现这种"浪"的效果,下面来一起看看。
    2016-08-08

最新评论