服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS自带原生二维码扫描的实现

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

2021-03-01 16:49Billy_W IOS

最近项目中需要做一个二维码扫描,虽然有很多二维码扫描的第三方可以用,但是考虑到项目中的需要,所以我放弃了使用三方库,而采用了苹果原生的扫描。下面这篇文章就介绍了iOS自带原生二维码扫描的实现,需要的朋友可以参

前言

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

下面进入正题:

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

?
1
2
#import <AVFoundation/AVFoundation.h>
<AVCaptureMetadataOutputObjectsDelegate>

2.接着是使用到的类

?
1
2
3
4
5
6
7
8
@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.懒加载一个扫描动画的图片

?
1
2
3
4
5
6
7
8
-(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当中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-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.二维码扫描的代理事件

?
1
2
3
4
5
6
7
8
9
10
-(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.添加扫描动画的事件

?
1
2
3
4
5
6
7
8
9
10
11
- (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自带原生二维码扫描的实现

总结

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

原文链接:http://www.jianshu.com/p/0a9a2ca8b5ec

延伸 · 阅读

精彩推荐
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01