IOS开发中原生二维码扫描设置
                            来源:爱站网时间:2021-01-28编辑:网友分享
                        
                        
                        随着移动智能的发展,很多功能都会添加到APP中方便用户的使用,而扫描这个功能也是常用的,下面这篇文章是爱站技术频道介绍的IOS开发中原生二维码扫描设置,一起进入下文学习吧!
                        随着移动智能的发展,很多功能都会添加到APP中方便用户的使用,而扫描这个功能也是常用的,下面这篇文章是爱站技术频道介绍的IOS开发中原生二维码扫描设置,一起进入下文学习吧!
前言
首先说明的是:原生的二维码扫描有一个坑,那就是扫描范围的确定。只要记得扫描范围是X与Y互换位置,W与H互换位置,就没有什么问题了。
下面进入正题:
1.因为使用原生二维码扫描,所以需要加入头文件添加delegate
#import
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开发中原生二维码扫描设置是很重要的,在开发项目之前一定要先看一看爱站技术频道介绍的这篇文章,或许会对开发有一定的帮助哦。
上一篇:IOS开发中图像放大的详情
下一篇:IOS开发中手势操作的总结
 
                    