iOS二维码扫描

原创 2017年01月03日 16:34:29

iOS原生二维码扫描

1.导入AVFoundation

代码如下

demo地址: https://github.com/NieYinlong/ScanQRCode.git

效果如下

//
//  ViewController.m
//  ScanQRCode
//
//  Created by YinlongNie on 17/1/3.
//  Copyright © 2017年 Jiuzhekan. All rights reserved.
//

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import "UIView+WLFrame.h"

#define  kScreenWidth [UIScreen mainScreen].bounds.size.width
#define  kScreenHeight [UIScreen mainScreen].bounds.size.height

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
{
    UIImageView *lineImageView;
    BOOL upOrDown;
    int num;
    NSTimer *timer;
    CGFloat lineX;
    CGFloat lineY;
    CGFloat lineWidth;
    CGFloat lineAnimationProportion;
}
@property (strong, nonatomic) AVCaptureDevice *device;
@property (strong, nonatomic) AVCaptureDeviceInput *input;
@property (strong, nonatomic) AVCaptureMetadataOutput *output;
@property (strong, nonatomic) AVCaptureSession *session;
@property (strong, nonatomic) AVCaptureVideoPreviewLayer *preView;
@end


@implementation ViewController
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    
    self.navigationController.navigationBar.hidden = NO;
    
    [self.session startRunning];
    [self openCamera];
}

- (void)viewDidLoad {
    [super viewDidLoad];
  
    [self setNavigationBar];
    [self addsubview];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    [self.session stopRunning];
    [timer invalidate];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (void)setNavigationBar
{
    self.view.backgroundColor = [UIColor blackColor];
    [self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];// 电池栏白色
    //  // 如果设置不透明从导航条底部开始计算frame
    self.navigationController.navigationBar.translucent = UIRectEdgeNone;
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"daoHangTiao"] forBarMetrics:(UIBarMetricsDefault)];
    self.navigationItem.title = @"二维码扫描";
    // 设置返回按钮为白色
    [self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];
    
    self.tabBarController.tabBar.hidden = YES;
    [self.navigationController setNavigationBarHidden:NO animated:YES];
    self.navigationController.navigationBar.hidden = NO;
}



- (void)addsubview{
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake((kScreenWidth - kScreenHeight/2)/2, 64+40, kScreenHeight/2, kScreenHeight/2)];
    imageView.image = [UIImage imageNamed:@"scan_back_image.png"];
    [self.view addSubview:imageView];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(15, CGRectGetMaxY(imageView.frame)+15, kScreenWidth-30, 50)];;
    label.backgroundColor = [UIColor clearColor];
    label.numberOfLines = 0;
    label.font = [UIFont systemFontOfSize:12];
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor grayColor];
    label.text = @"请将二维码对准扫码框!";
    [self.view addSubview:label];
    
    upOrDown = NO;
    num = 0;
    
    if (kScreenHeight == 480){
        lineX = 60;
        lineY = imageView.top + 15;
        lineWidth = imageView.width - 50;
        lineAnimationProportion = 1.5;
    }else if (kScreenHeight == 568){
        lineX = 40;
        lineY = imageView.top + 15;
        lineWidth = imageView.width - 50;
        lineAnimationProportion = 1.7;
    }else if (kScreenHeight == 667){
        lineX = 40;
        lineY = imageView.top + 15;
        lineWidth = imageView.width - 50;
        lineAnimationProportion = 2;
    }else{
        lineX = 45;
        lineY = imageView.top + 15;
        lineWidth = imageView.width - 50;
        lineAnimationProportion = 2.2;
    }
    
    lineImageView = [[UIImageView alloc] initWithFrame:CGRectMake(lineX, lineY, lineWidth, 2)];
    lineImageView.image = [UIImage imageNamed:@"scan_line_image.png"];
    [self.view addSubview:lineImageView];
    
    timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(lineAnimation) userInfo:nil repeats:YES];
}

#pragma mark Target Action
- (void)lineAnimation{
    
    if (upOrDown == NO){
        num++;
        lineImageView.frame = CGRectMake(lineX, lineY + lineAnimationProportion * num, lineWidth, 2);
        if (2 * num == 260)
        {
            upOrDown = YES;
        }
    }else{
        num--;
        lineImageView.frame = CGRectMake(lineX, lineY + lineAnimationProportion * num, lineWidth, 2);
        if (num == 0){
            upOrDown = NO;
        }
    }
}

- (void)openCamera{
    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:&error];
    if (error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"未获得授权使用摄像头" message:@"请在iOS『设置』-『隐私』-『相机』中打开" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles:nil, nil];
        alert.tag = 840;
        [alert show];
        return;
    }
    self.output = [[AVCaptureMetadataOutput alloc] init];
    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    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];
    self.preView = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.preView.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.preView.frame = CGRectMake((kScreenWidth - kScreenHeight/2)/2, 64+40, kScreenHeight/2, kScreenHeight/2);
    [self.view.layer insertSublayer:self.preView atIndex:0];
    [self.session startRunning];
}

#pragma mark AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if ([metadataObjects count] > 0){
        AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0];
        NSString *string = metadataObject.stringValue;
      
        NSLog(@"二维码信息:%@", string);
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"扫描出来的信息" message:string delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
        [alert show];
        
        
        // 这里可以进行跳转或者返回
        
    }
    [self.session stopRunning];
    
    
    
    

}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}
@end


版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS原生自定义二维码扫描界面(类似微信)

本次demo的特点:1.利用苹果原生的框架进行二维码的扫描功能 2.利用动画等效果自定义扫描界面。...
  • huanghao12
  • huanghao12
  • 2016年01月06日 22:26
  • 5183

iOS 原生二维码的扫描详解(代码)

#import // 要引入 static const CGFloat kBorderW = 100; static const CGFloat kMargin = 30; @interface S...
  • mazegong
  • mazegong
  • 2016年04月26日 10:02
  • 1563

iOS 原生二维码扫描(可限制扫描区域)

写这篇文章的主要原因不是展示如何使用 AVFoundation   来进行二维码扫描,更主要的是限制扫描二维码的范围。(因为默认的是全屏扫描) 项目遇到扫描二维码的功能需求,这里我放弃了使用三方库,而...
  • u012884714
  • u012884714
  • 2014年11月27日 18:24
  • 16887

ios 原生二维码扫描以及需要注意事项

最近在研究ios的二维码扫描功能,网上有好多诸如ZXing,ZBar第三方类库的介绍,如果仅仅是为了扫码,我觉得使用第三方类库有些麻烦,其实ios提供了二维码扫描的api,不多说了,直接上代码 ...
  • chengjiamei
  • chengjiamei
  • 2015年11月06日 20:35
  • 1062

IOS原声二维码条形码扫描实现

本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW。细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了。这个代码自己写就行了,与本文关系不大。。。绿色的...
  • hbblzjy
  • hbblzjy
  • 2016年04月17日 21:28
  • 1930

iOS二维码扫描 原生API 源码Demo 2016最新版本 简单易用

事到如今,2016年了 iOS中的二维码扫描,什么ZXing, ZBar库都过时了,本博主,今天写了一个二维码扫描库,是最新版本的,兼容iOS7.0及以后的系统,主要用Objective-C写的,以后...
  • u013538542
  • u013538542
  • 2016年07月11日 20:24
  • 5009

IOS下使用AVFoundation实现条形码和二维码扫描

IOS下使用AVFoundation实现条形码和二维码扫描
  • u012399891
  • u012399891
  • 2016年01月08日 14:40
  • 7396

iOS 二维码扫描(你想要的都在这里了)

以前就写过二维码扫描的文章,今天难得抽出来时间重新整理了一下,把所有用都的关于二维码的都写在这了,二维码问题,看了这一篇文章就什么都解决了 原生二维码扫描 个人是比较支持用原生二维码扫描的...
  • qq_30513483
  • qq_30513483
  • 2016年05月09日 14:12
  • 14583

iOS 学习日志 : iOS原生二维码的扫描以及限定扫描范围

现在的app多少都会加入二维码扫描功能,方便快捷,开发中常常会碰到这样的需求.定义会话和输出流对象@property (nonatomic) AVCaptureSession *captureSess...
  • crakid
  • crakid
  • 2015年12月21日 17:01
  • 1115

IOS二维码扫描功能的实现

之前很多二维码扫描都是基于zxing做的,但是zxing用起来真的很麻烦,又一直不更新。随着iOS6退出历史舞台,终于可以使用iOS7以后,用系统的AVFoundation做的二维码扫描器了。 ...
  • COOL_BEAR_XX
  • COOL_BEAR_XX
  • 2015年05月20日 01:27
  • 1340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS二维码扫描
举报原因:
原因补充:

(最多只允许输入30个字)