美文网首页
iOS-原生二维码

iOS-原生二维码

作者: ten3fang | 来源:发表于2015-11-24 13:28 被阅读735次

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

    首先引入系统头文件
    #import <AVFoundation/AVFoundation.h>
    然后遵守代理
    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);
            }];
        }
    }
    

    效果图如下:


    B8846C919DED31A0493B7AE0E0C8EF06.png

    相关文章

      网友评论

          本文标题:iOS-原生二维码

          本文链接:https://www.haomeiwen.com/subject/krvrhttx.html