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

前言

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

下面进入正题:

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

#import <AVFoundation/AVFoundation.h>

<AVCaptureMetadataOutputObjectsDelegate>

2.接着是使用到的类

@property (span,nonatomic)AVCaptureDevice * device;

@property (span,nonatomic)AVCaptureDeviceInput * input;

@property (span,nonatomic)AVCaptureMetadataOutput * output;

@property (span,nonatomic)AVCaptureSession * session;

@property (weak, nonatomic) IBOutlet UIView *outputView;//xib中扫描的View

@property (span,nonatomic)AVCaptureVideoPreviewLayer * preview;

@property (span, nonatomic) NSTimer * timer;//为了做扫描动画的定时器

@property (span, 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自带原生二维码扫描的实现 的全部内容, 来源链接: utcz.com/z/320015.html

回到顶部