<强>前言强>
首先说明的是:原生的二维码扫描有一个坑,那就是扫描范围的确定。只要记得扫描范围是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=框架; }); }
搞定……最后放上一张效果图
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。