美文网首页
ios 扫一扫(系统自带)

ios 扫一扫(系统自带)

作者: 肉肉要次肉 | 来源:发表于2020-04-26 11:47 被阅读0次

    #import  <AVFoundation/AVFoundation.h>

    #define QRCodeWidth  260.0  //正方形二维码的边长

    @interface ScanViewController ()<AVCaptureMetadataOutputObjectsDelegate>

    @property (nonatomic,strong)AVCaptureSession * session;

    @property (nonatomic,strong)AVCaptureVideoPreviewLayer * preview;

    @end

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        self.navigationItem.title = @"扫一扫";

        self.navigationController.toolbarHidden = YES;//如果你的根视图有底部工具栏,这行代码可以隐藏底部的工具栏

        [self setupMaskView];//设置扫描区域之外的阴影视图

        [self setupScanWindowView];//设置扫描二维码区域的视图

        [self beginScanning];//开始扫二维码

    }

    - (void)setupMaskView{

        //设置统一的视图颜色和视图的透明度

        UIColor*color = [UIColorblackColor];

        floatalpha =0.7;

        //设置扫描区域外部上部的视图

        UIView*topView = [[UIViewalloc]init];

        topView.frame = CGRectMake(0, 0, ScreenWidth, (ScreenHeight-64-QRCodeWidth)/2.0-64);

        topView.backgroundColor= color;

        topView.alpha= alpha;

        //设置扫描区域外部左边的视图

        UIView*leftView = [[UIViewalloc]init];

        leftView.frame=CGRectMake(0, topView.frame.size.height, (ScreenWidth-QRCodeWidth)/2.0,QRCodeWidth);

        leftView.backgroundColor= color;

        leftView.alpha= alpha;

        //设置扫描区域外部右边的视图

        UIView*rightView = [[UIViewalloc]init];

        rightView.frame = CGRectMake((ScreenWidth-QRCodeWidth)/2.0+QRCodeWidth,topView.frame.size.height, (ScreenWidth-QRCodeWidth)/2.0,QRCodeWidth);

        rightView.backgroundColor= color;

        rightView.alpha= alpha;

        //设置扫描区域外部底部的视图

        UIView*botView = [[UIViewalloc]init];

        botView.frame=CGRectMake(0,QRCodeWidth+topView.frame.size.height,ScreenWidth,ScreenHeight-64-QRCodeWidth-topView.frame.size.height);

        botView.backgroundColor= color;

        botView.alpha= alpha;

        UILabel*signL = [[UILabelalloc]init];

        [botViewaddSubview:signL];

        [signLmas_makeConstraints:^(MASConstraintMaker*make) {

            make.top.equalTo(botView.mas_top).offset(10);

            make.centerX.equalTo(botView.mas_centerX);

        }];

        signL.text = @"将二维码放入框内即可自动扫描";

        signL.textColor = [UIColor whiteColor];

        signL.font = [UIFont systemFontOfSize:13];

        //将设置好的扫描二维码区域之外的视图添加到视图图层上

        [self.viewaddSubview:topView];

        [self.viewaddSubview:leftView];

        [self.viewaddSubview:rightView];

        [self.viewaddSubview:botView];

    }

    - (void)setupScanWindowView{

        //设置扫描区域的位置(考虑导航栏和电池条的高度为64)

        UIView *scanWindow = [[UIView alloc]initWithFrame:CGRectMake((ScreenWidth-QRCodeWidth)/2.0,(ScreenHeight-QRCodeWidth-64)/2.0-64,QRCodeWidth,QRCodeWidth)];

        scanWindow.clipsToBounds=YES;

        [self.viewaddSubview:scanWindow];

        //设置扫描区域的动画效果

        CGFloatscanNetImageViewH =241;

        CGFloatscanNetImageViewW = scanWindow.frame.size.width;

        UIImageView*scanNetImageView = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"scan_net"]];

        scanNetImageView.frame=CGRectMake(0, -scanNetImageViewH, scanNetImageViewW, scanNetImageViewH);

        CABasicAnimation *scanNetAnimation = [CABasicAnimation animation];

        scanNetAnimation.keyPath =@"transform.translation.y";

        scanNetAnimation.byValue=@(QRCodeWidth);

        scanNetAnimation.duration=1.0;

        scanNetAnimation.repeatCount=MAXFLOAT;

        [scanNetImageView.layeraddAnimation:scanNetAnimationforKey:nil];

        [scanWindowaddSubview:scanNetImageView];

        //设置扫描区域的四个角的边框

        CGFloatbuttonWH =18;

        UIButton*topLeft = [[UIButtonalloc]initWithFrame:CGRectMake(0,0, buttonWH, buttonWH)];

        [topLeftsetImage:[UIImage imageNamed:@"scan_1"]forState:UIControlStateNormal];

        [scanWindowaddSubview:topLeft];

        UIButton*topRight = [[UIButtonalloc]initWithFrame:CGRectMake(QRCodeWidth- buttonWH,0, buttonWH, buttonWH)];

        [topRightsetImage:[UIImage imageNamed:@"scan_2"]forState:UIControlStateNormal];

        [scanWindowaddSubview:topRight];

        UIButton*bottomLeft = [[UIButtonalloc]initWithFrame:CGRectMake(0,QRCodeWidth- buttonWH, buttonWH, buttonWH)];

        [bottomLeftsetImage:[UIImage imageNamed:@"scan_3"]forState:UIControlStateNormal];

        [scanWindowaddSubview:bottomLeft];

        UIButton*bottomRight = [[UIButtonalloc]initWithFrame:CGRectMake(QRCodeWidth-buttonWH,QRCodeWidth-buttonWH, buttonWH, buttonWH)];

        [bottomRightsetImage:[UIImage imageNamed:@"scan_4"]forState:UIControlStateNormal];

        [scanWindowaddSubview:bottomRight];

    }

    - (void)beginScanning{

        //获取摄像设备

        AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        //创建输入流

        AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

        if(!input)return;

        //创建输出流

        AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];

        //特别注意的地方:有效的扫描区域,定位是以设置的右顶点为原点。屏幕宽所在的那条线为y轴,屏幕高所在的线为x轴

        CGFloat x = ((ScreenHeight-QRCodeWidth-64)/2.0)/ScreenHeight;

        CGFloat y = ((ScreenWidth-QRCodeWidth)/2.0)/ScreenWidth;

        CGFloat width = QRCodeWidth/ScreenHeight;

        CGFloat height = QRCodeWidth/ScreenWidth;

        output.rectOfInterest=CGRectMake(x, y, width, height);

        //设置代理在主线程里刷新

        [outputsetMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

        //初始化链接对象

        _session = [[AVCaptureSession alloc]init];

        //高质量采集率

        [_session setSessionPreset:AVCaptureSessionPresetHigh];

        [_sessionaddInput:input];

        [_sessionaddOutput:output];

        //设置扫码支持的编码格式(如下设置条形码和二维码兼容)

      output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code];

        AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:_session];

        layer.videoGravity=AVLayerVideoGravityResizeAspectFill;

        layer.frame=self.view.layer.bounds;

        [self.view.layer insertSublayer:layer atIndex:0];

        //开始捕获

        [_session startRunning];

    }

    -(void)captureOutput:(AVCaptureOutput*)captureOutputdidOutputMetadataObjects:(NSArray*)metadataObjectsfromConnection:(AVCaptureConnection*)connection{

        if(metadataObjects.count>0) {

            [_sessionstopRunning];

            //得到二维码上的所有数据

            AVMetadataMachineReadableCodeObject* metadataObject = [metadataObjectsobjectAtIndex:0];

           //获取到扫描结果

            NSString*str = metadataObject.stringValue;

            NSLog(@"字符串:%@",str);

        }

    }

    相关文章

      网友评论

          本文标题:ios 扫一扫(系统自带)

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