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

  

<强>前言

  

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

  

下面进入正题:
  

  

<强> 1。因为使用原生二维码扫描,所以需要加入头文件添加代表

        # import & lt; AVFoundation/AVFoundation.h>   & lt; AVCaptureMetadataOutputObjectsDelegate>      

<强> 2。接着是使用到的类

        @ property(强,原子)AVCaptureDevice *装置;   @ property(强,原子)AVCaptureDeviceInput *输入;   @ property(强,原子)AVCaptureMetadataOutput *输出;   @ property(强,原子)AVCaptureSession *会话;   @ property(弱,原子)IBOutlet UIView * outputView;//xib中扫描的观点   @ property(强,原子)AVCaptureVideoPreviewLayer *预览;   @ property(强,原子)NSTimer *计时器;//为了做扫描动画的定时器   @ property(强,原子)UIImageView * lineImage;//扫描动画的横线      

<强> 3。懒加载一个扫描动画的图片

        ——(UIImageView *) lineImage {   如果(! _lineImage) {   CGFloat outputW=self.outputView.frame.size.width;   _lineImage=[[UIImageView alloc] initWithFrame: CGRectMake (0, 0, outputW, 2)];   _lineImage。形象=[界面图像imageNamed: @“雷”);   }   返回_lineImage;   }      

<>强4。使用前的设置,我将它设置在了viewDidLoad当中

        viewdidload {   (超级viewDidLoad);//设备   _device=[AVCaptureDevice defaultDeviceWithMediaType AVMediaTypeVideo):;//输入   _input=[AVCaptureDeviceInput deviceInputWithDevice: self.device错误:nil);//输出   _output=[[AVCaptureMetadataOutput alloc] init);   [_output setMetadataObjectsDelegate:自我队列:dispatch_get_main_queue ());//会话   _session=[[AVCaptureSession alloc] init);   [_session setSessionPreset AVCaptureSessionPresetHigh):;//连接输入和输出   如果([_session canAddInput: self.input])   {   [_session addInput self.input):;   }      如果([_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。层insertSublayer: _preview atIndex: 0];//开始扫描   [_session startRunning];//添加扫描动画定时器   (自我。outputView addSubview self.lineImage):;//加载后任何额外设置视图的笔尖。   _timer=[NSTimer scheduledTimerWithTimeInterval: 2.5 f   目标:自我   选择器:@ selector (lineAction)   用户信息:零   重复:是的);   }      

<强> 5。二维码扫描的代理事件

        - (void) captureOutput: (AVCaptureOutput *) captureOutput didOutputMetadataObjects: (NSArray *) metadataObjects fromConnection: (AVCaptureConnection *)连接   {   stringValue NSString *;   如果(metadataObjects数在0){//停止扫描   [_session stopRunning];   AVMetadataMachineReadableCodeObject * metadataObject=(metadataObjects, objectAtIndex: 0);   stringValue stringValue=https://www.yisu.com/zixun/metadataObject.stringValue;//是扫描拿到的内容,更具内容进行后续工作。   }   }      

<强> 6。添加扫描动画的事件

        - (void) lineAction {   CGFloat outputW=self.outputView.frame.size.width;   CGFloat outputH=self.outputView.frame.size.height;   [UIView animateWithDuration: 2.4 f动画:^ {   CGRect中?CGRectMake (0, outputH outputW 2);   self.lineImage.frame=框架;   }完成:^ (BOOL完成){   CGRect中?CGRectMake (0, 0, outputW 2);   self.lineImage.frame=框架;   });   }      

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

  

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

  

  

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

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