ios二维码扫描

1.添加AVFoundation.framework框架

2,控制器中实现

//第一步添加AVFoundation.framework框架

 

 

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>

#import "RYPreView.h"

 

 

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

//定义输入设备,用户采集信息,

@property(nonatomic,strong)AVCaptureDeviceInput*input;

//定义输出设备,处理采集的信息,获得数据

@property(nonatomic,strong)AVCaptureMetadataOutput*outPut;

//定义连接输入输出设备的会话

@property(nonatomic,strong)AVCaptureSession*session;

//定义展示信息的图层

@property(nonatomic,strong)RYPreView*preview;

 

 

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    //1,定义输入设备,摄像头

    AVCaptureDevice *device=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    self.input=[AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];

    //2.输出设备

    self.outPut=[[AVCaptureMetadataOutput alloc]init];

    //3.定义session会话

    self.session=[[AVCaptureSession alloc]init];

    //展示大小

    [self.session setSessionPreset:AVCaptureSessionPreset640x480];

    //添加输入输出设备

    if([self.session canAddInput:self.input])

    {

        [self.session addInput:self.input];

    }

    if ([self.session canAddOutput:self.outPut]) {

        [self.session addOutput:self.outPut];

    }

    //指定输出设备代理

    [self.outPut setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    //设置元数据类型 二维码

    [self.outPut setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    //需要一个特殊的layer来处理展示的数据 AVCaptureVideoPreviewLayer

    //方法一可以再这里创建并设置大小

    //方法二

    RYPreView *preview=[[RYPreView alloc]initWithFrame:self.view.bounds];

    preview.session=self.session;

    [self.view addSubview:preview];

    //开启会话

    [self.session startRunning];

    

    

}

//解析元数据调用

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

    //停止会话

    [self.session stopRunning];

    //移除视图layer

    [self.preview removeFromSuperview];

    //获取信息

    for (AVMetadataMachineReadableCodeObject* objc in metadataObjects) {

        NSLog(@"%@",objc.stringValue);

    }

}

 

 

@end

 

 

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

 

@interface RYPreView : UIView

 

 

//定义session,实现session与当前layer绑定

@property(nonatomic,strong)AVCaptureSession*session;

 

@end

#import "RYPreView.h"

@interface RYPreView()

@property(nonatomic,strong)UIImageView*imageCover;

@property(nonatomic,strong)UIImageView*lineImage;//

@property(nonatomic,strong)NSTimer*timer;//动画时间间距

 

@end

 

 

 

@implementation RYPreView

//自定义需要layer的类型 session 需要绑定的layer类型为AVCaptureVideoPreviewLayer

+(Class)layerClass

{

    return [AVCaptureVideoPreviewLayer class];

}

//重写set方法

-(void)setSession:(AVCaptureSession *)session

{

    _session=session;

    AVCaptureVideoPreviewLayer *layer=(AVCaptureVideoPreviewLayer*)self.layer;

    layer.session=session;

}

-(instancetype)initWithFrame:(CGRect)frame

{

    if (self=[super initWithFrame:frame]) {

        [self addSubviewWithFrame];

    }

    return self;

}

//初始化自定义控件

-(void)addSubviewWithFrame

{

    //设置背景图片

    self.imageCover = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pick_bg.png"]];

    //设置位置到界面的中间

    self.imageCover.frame = CGRectMake(self.bounds.size.width * 0.5 - 140, self.bounds.size.height * 0.5 - 140, 280, 280);

    //添加到视图上

    [self addSubview:self.imageCover];

    

    //初始化二维码的扫描线的位置

    self.lineImage = [[UIImageView alloc] initWithFrame:CGRectMake(30, 10, 220, 2)];

    self.lineImage.image = [UIImage imageNamed:@"line.png"];

    [self.imageCover addSubview:self.lineImage];

    

    //开启定时器

    _timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(animation) userInfo:nil repeats:YES];

}

- (void)animation

{

    [UIView animateWithDuration:2.8 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

        

        self.lineImage.frame = CGRectMake(30, 260, 220, 2);

        

    } completion:^(BOOL finished) {

        self.lineImage.frame = CGRectMake(30, 10, 220, 2);

    }];

}

@end

 

原文地址:https://www.cnblogs.com/tangranyang/p/4656151.html