iOS-原生二维码

注释:此篇文章介绍如何用系统原生二维码

首先引入系统头文件
#import 
然后遵守代理
AVCaptureMetadataOutputObjectsDelegate

代码如下:

@property (nonatomic,strong) AVCaptureDevice *device;//设备
@property (nonatomic,strong) AVCaptureDeviceInput *input;//输入
@property (nonatomic,strong) AVCaptureMetadataOutput *output;//输出
@property (nonatomic,strong) AVCaptureSession *session;//桥梁
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;//摄像头显示图层

@property (nonatomic,strong) NSTimer *timer;
@property (nonatomic,strong) UIView *lineView;
#pragma mark - 二维码
//初始化
- (instancetype)init
{
    if(self == [super init])
    {
        [self createInstanceView];//创建覆盖层
        [self setCamera];
    }
    return self;
}
- (void)createInstanceView
{
    UIView *upView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, UI_width, (UI_height-220*UI_width/320)/2-64)];
    upView.alpha = 0.5f;
    upView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:upView];
    
    UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(upView.frame), (UI_width-220*UI_width/320)/2, 220*UI_width/320)];
    leftView.alpha = 0.5f;
    leftView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:leftView];
    
    UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(UI_width-CGRectGetWidth(leftView.frame), CGRectGetMaxY(upView.frame), (UI_width-220*UI_width/320)/2, 220*UI_width/320)];
    rightView.alpha = 0.5f;
    rightView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:rightView];
    
    UIView *downView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(leftView.frame), UI_width, (UI_height-220*UI_width/320)/2)];
    downView.alpha = 0.5f;
    downView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:downView];
}
- (void)setCamera
{
    //Device
    if(!self.device){
        self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    }
    // Input
    if (!self.input) {
        self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
    }
    // Output
    if (!self.output) {
        self.output = [[AVCaptureMetadataOutput alloc]init];
        [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    }
    // Session
    if (!self.session) {
        self.session = [[AVCaptureSession alloc]init];
        [self.session setSessionPreset:AVCaptureSessionPresetHigh];
    }
    if ([self.session canAddInput:self.input]){
        [self.session addInput:self.input];
    }
    if ([self.session canAddOutput:self.output]){
        [self.session addOutput:self.output];
    }
    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
    
    CGFloat x = (UI_width-220*UI_width/320)/2;
    CGFloat width = 220*UI_width/320;
    CGFloat height = 220*UI_width/320;
    CGFloat y = (UI_height-220*UI_width/320)/2;
    CGRect scanCrop = [self getScanCrop:CGRectMake(x, y, width, height) readerViewBounds:self.view.frame];
    self.output.rectOfInterest = scanCrop;

    // Preview
    if(!self.previewLayer){
        
        self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
        self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
//        self.previewLayer.frame = CGRectMake((UI_width-220*UI_width/320)/2, (UI_height-220*UI_width/320)/2,220*UI_width/320, 220*UI_width/320);
        self.previewLayer.frame = self.view.frame;
        [self.view.layer insertSublayer:self.previewLayer atIndex:0];
        
    }
    [self.session startRunning];
    
}
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds {
    
    CGFloat x,y,width,height;
    
    x = rect.origin.y/UI_height - 0.1;
    y = rect.origin.x/UI_width;
    width = rect.size.height/UI_height;
    height = rect.size.width/UI_width;
    
    return CGRectMake(x, y, width, height);
    
}

#pragma mark AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    if ([metadataObjects count] >0){
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
        NSLog(@"metadataObject.stringValue = %@ \n metadataObject.corners = %@",metadataObject.stringValue,metadataObject.corners);//扫描后输出信息
        if([[metadataObject.stringValue substringToIndex:7] isEqualToString:@"http://"])
        {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",metadataObject.stringValue]]];
        }
        else if ([[metadataObject.stringValue substringToIndex:4] isEqualToString:@"www."])
        {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@",metadataObject.stringValue]]];
        }
        else
        {
            [Helper helperPointWithTitle:metadataObject.stringValue];
            [self.session startRunning];
        }
        [self.session stopRunning];
        [self.timer invalidate];
    }
}
//注意,在界面消失的时候关闭session
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.session stopRunning];
}
//以下是UI,动画扫描
- (void)createUI
{
    UIImageView *bgImageView = [YYTools createImageViewWithFrame:CGRectMake(0, 0, 265*UI_width/320, 265*UI_width/320) andBackgroundColor:[UIColor clearColor] andImage:@"bg_scanner.png" andObject:nil andSEL:nil andTag:0];
    bgImageView.center = self.view.center;
    [self.view addSubview:bgImageView];
    
    self.lineView = [YYTools createViewWithFrame:CGRectMake((UI_width-270*UI_width/320)/2, (UI_height-220*UI_width/320)/2, 270*UI_width/320, 1) andBackgroundColoc:[UIColor greenColor]];
    self.lineView.layer.cornerRadius = 8;
    [self.view addSubview:self.lineView];//+220*UI_width/320
    if(!self.timer)
    {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(animatedTimer) userInfo:nil repeats:YES];
    }
}
- (void)animatedTimer
{
    if(self.lineView.frame.origin.y == (UI_height-220*UI_width/320)/2)
    {
        [UIView animateWithDuration:1.0f animations:^{
            self.lineView.frame = CGRectMake((UI_width-270*UI_width/320)/2, (UI_height-220*UI_width/320)/2+220*UI_width/320, 270*UI_width/320, 1);
        }];
    }
    else if ((UI_height-220*UI_width/320)/2+220*UI_width/320)
    {
        [UIView animateWithDuration:1.0f animations:^{
            self.lineView.frame = CGRectMake((UI_width-270*UI_width/320)/2, (UI_height-220*UI_width/320)/2, 270*UI_width/320, 1);
        }];
    }
}

效果图如下:


iOS-原生二维码_第1张图片
B8846C919DED31A0493B7AE0E0C8EF06.png

你可能感兴趣的:(iOS-原生二维码)