美文网首页iOS技术篇
二维码、条形码扫描

二维码、条形码扫描

作者: zhangyajie | 来源:发表于2016-05-20 23:47 被阅读333次

    本文介绍的是系统自带的二维码扫描!方便简单实用。-----话不多说,直接上干货!

    三步就搞定!!!!!!!          QQ :  137026391--马尾  欢迎指教


    1、首页   先创建扫描按钮、显示扫描结果的label


    - (void)viewDidLoad {

    [super viewDidLoad];

    //扫描按钮

    self.scanButton = [UIButton buttonWithType:UIButtonTypeSystem];

    self.scanButton.frame = CGRectMake((SCREEN_WIDTH - 100) / 2, SCREEN_HEIGHT - 100, 100, 30);

    [self.scanButton setTitle:@"扫描" forState:UIControlStateNormal];

    [self.scanButton addTarget:self action:@selector(scanAction:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:self.scanButton];

    //显示扫描结果

    self.resultLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 200, SCREEN_WIDTH, 100)];

    self.resultLabel.textAlignment = NSTextAlignmentCenter;

    self.resultLabel.numberOfLines = 0;

    self.resultLabel.backgroundColor = [UIColor redColor];

    [self.view addSubview:self.resultLabel];

    }

    * 扫描事件

    - (void)scanAction:(UIButton *)sender{

    ZFScanViewController * vc = [[ZFScanViewController alloc] init];

    vc.returnScanBarCodeValue = ^(NSString * barCodeString){

    self.resultLabel.text = [NSString stringWithFormat:@"扫描结果:\n%@",barCodeString];

    NSLog(@"扫描结果的字符串======%@",barCodeString);

    };

    [self.navigationController pushViewController:vc animated:YES];

    }


    2、创建扫描

    #import "ZFScanViewController.h"

    #import#import "ZFConst.h"

    #import "ZFMaskView.h"

    @interface ZFScanViewController ()

    /** 输入输出的中间桥梁 */

    @property (nonatomic, strong) AVCaptureSession * session;

    /** 扫描支持的编码格式的数组 */

    @property (nonatomic, strong) NSMutableArray * metadataObjectTypes;

    /** 遮罩层 */

    @property (nonatomic, strong) ZFMaskView * maskView;

    @end

    @implementation ZFScanViewController

    - (NSMutableArray *)metadataObjectTypes{

    if (!_metadataObjectTypes) {

    _metadataObjectTypes = [NSMutableArray arrayWithObjects:AVMetadataObjectTypeAztecCode, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeUPCECode, nil];

    // >= iOS 8

    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {

    [_metadataObjectTypes addObjectsFromArray:@[AVMetadataObjectTypeInterleaved2of5Code, AVMetadataObjectTypeITF14Code, AVMetadataObjectTypeDataMatrixCode]];

    }

    }

    return _metadataObjectTypes;

    }

    - (void)viewWillDisappear:(BOOL)animated{

    [super viewWillDisappear:animated];

    [self.maskView removeAnimation];

    }

    - (void)viewDidLoad {

    [super viewDidLoad];

    [self capture];

    [self addUI];

    }

    /**

    *  添加遮罩层

    */

    - (void)addUI{

    self.maskView = [[ZFMaskView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];

    [self.view addSubview:self.maskView];

    }

    /**

    *  扫描初始化

    */

    - (void)capture{

    //获取摄像设备

    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    //创建输入流

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

    //创建输出流

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

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

    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    //初始化链接对象

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

    //高质量采集率

    self.session.sessionPreset = AVCaptureSessionPresetHigh;

    [self.session addInput:input];

    [self.session addOutput:output];

    AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];

    layer.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    layer.backgroundColor = [UIColor yellowColor].CGColor;

    [self.view.layer addSublayer:layer];

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

    output.metadataObjectTypes = self.metadataObjectTypes;

    //开始捕获

    [self.session startRunning];

    }

    #pragma mark - AVCaptureMetadataOutputObjectsDelegate

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

    if (metadataObjects.count > 0) {

    [self.session stopRunning];

    AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects.firstObject;

    self.returnScanBarCodeValue(metadataObject.stringValue);

    [self.navigationController popViewControllerAnimated:YES];

    }

    }


    3、设置扫描界面的UI

    #import "ZFMaskView.h"

    #import "ZFConst.h"

    @interface ZFMaskView()

    @property (nonatomic, strong) UIImageView * scanLineImg;

    @end

    @implementation ZFMaskView

    - (instancetype)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];

    if (self) {

    [self addUI];

    }

    return self;

    }

    /**

    *  添加UI

    */

    - (void)addUI{

    //遮罩层

    UIView * maskView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

    maskView.backgroundColor = [UIColor blackColor];

    maskView.alpha = 0.5;

    maskView.layer.mask = [self maskLayer];

    [self addSubview:maskView];

    //提示框

    UILabel * hintLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width - 120, 60)];

    hintLabel.text = @"将 二维码/条形码 放入框内中央,即可自动扫描";

    hintLabel.center = CGPointMake(maskView.center.x, maskView.center.y + (self.frame.size.width - 120) * 0.5 + 40);

    hintLabel.textColor = [UIColor lightGrayColor];

    hintLabel.numberOfLines = 0;

    hintLabel.textAlignment = NSTextAlignmentCenter;

    [self addSubview:hintLabel];

    //边框

    UIImage * topLeft = [UIImage imageNamed:@"ScanQR1"];

    UIImage * topRight = [UIImage imageNamed:@"ScanQR2"];

    UIImage * bottomLeft = [UIImage imageNamed:@"ScanQR3"];

    UIImage * bottomRight = [UIImage imageNamed:@"ScanQR4"];

    //左上

    UIImageView * topLeftImg = [[UIImageView alloc] initWithFrame:CGRectMake((self.frame.size.width - (self.frame.size.width - 120)) * 0.5, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5, topLeft.size.width, topLeft.size.height)];

    topLeftImg.image = topLeft;

    [self addSubview:topLeftImg];

    //右上

    UIImageView * topRightImg = [[UIImageView alloc] initWithFrame:CGRectMake((self.frame.size.width - (self.frame.size.width - 120)) * 0.5 - topRight.size.width + self.frame.size.width - 120, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5, topRight.size.width, topRight.size.height)];

    topRightImg.image = topRight;

    [self addSubview:topRightImg];

    //左下

    UIImageView * bottomLeftImg = [[UIImageView alloc] initWithFrame:CGRectMake((self.frame.size.width - (self.frame.size.width - 120)) * 0.5, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5 - bottomLeft.size.height + self.frame.size.width - 120, bottomLeft.size.width, bottomLeft.size.height)];

    bottomLeftImg.image = bottomLeft;

    [self addSubview:bottomLeftImg];

    //右下

    UIImageView * bottomRightImg = [[UIImageView alloc] initWithFrame:CGRectMake((self.frame.size.width - (self.frame.size.width - 120)) * 0.5 - bottomRight.size.width + self.frame.size.width - 120, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5 - bottomRight.size.width + self.frame.size.width - 120, bottomRight.size.width, bottomRight.size.height)];

    bottomRightImg.image = bottomRight;

    [self addSubview:bottomRightImg];

    //扫描线

    UIImage * scanLine = [UIImage imageNamed:@"QRCodeScanLine"];

    self.scanLineImg = [[UIImageView alloc] initWithFrame:CGRectMake((self.frame.size.width - (self.frame.size.width - 120)) * 0.5, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5, self.frame.size.width - 120, scanLine.size.height)];

    self.scanLineImg.image = scanLine;

    self.scanLineImg.contentMode = UIViewContentModeScaleAspectFit;

    [self addSubview:self.scanLineImg];

    [self.scanLineImg.layer addAnimation:[self animation] forKey:nil];

    }

    - (CABasicAnimation *)animation{

    CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"position"];

    animation.duration = 3;

    animation.fillMode = kCAFillModeForwards;

    animation.removedOnCompletion = NO;

    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

    animation.repeatCount = MAXFLOAT;

    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(self.center.x, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5)];

    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.center.x, self.scanLineImg.frame.origin.y + self.frame.size.width - 120 - self.scanLineImg.frame.size.height * 0.5)];

    return animation;

    }

    /**

    *  遮罩层bezierPath

    *

    *  @return UIBezierPath

    */

    - (UIBezierPath *)maskPath{

    UIBezierPath * bezier = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];

    [bezier appendPath:[[UIBezierPath bezierPathWithRect:CGRectMake((self.frame.size.width - (self.frame.size.width - 120)) * 0.5, (self.frame.size.height - (self.frame.size.width - 120)) * 0.5, self.frame.size.width - 120, self.frame.size.width - 120)] bezierPathByReversingPath]];

    return bezier;

    }

    /**

    *  遮罩层ShapeLayer

    *

    *  @return CAShapeLayer

    */

    - (CAShapeLayer *)maskLayer{

    CAShapeLayer * layer = [CAShapeLayer layer];

    layer.path = [self maskPath].CGPath;

    return layer;

    }

    /**

    *  移除动画

    */

    - (void)removeAnimation{

    [self.scanLineImg.layer removeAllAnimations];

    }

    @end

    相关文章

      网友评论

      本文标题:二维码、条形码扫描

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