二维码:ZBarReaderViewController

二维码扫描思路:获取二维码内部信息 + 处理刚刚获取到的内部信息


优点:二维码+条形码

头文件:#import "ZBarSDK.h"


info.plist文件 配置:

<!-- 相机 -->
<key>NSCameraUsageDescription</key>
<string>APP需要您的同意,才能访问相机</string>

参《iOS10之后 权限设置


宏定义:#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) //屏宽

A.直接使用ZBarReaderViewController:

协议:ZBarReaderDelegate


当前视图控制器中,添加一个按钮。点击跳到下一个界面:

UIButton * btn = [[UIButton alloc] initWithFrame:CGRectMake(30,70, 150,35)];
btn.backgroundColor = [UIColor lightGrayColor];
[btn setTitle:@"点击,扫描" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(clickToPresentZbarView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];



在“-(void)clickToPresentZbarView”里:

ZBarReaderViewController * readerVC = [[ZBarReaderViewController alloc] init];
readerVC.readerDelegate = self;

readerVC.showsZBarControls = YES;//显示控制项
readerVC.tracksSymbols = YES; //显示追踪框

//设置识别范围
//(距离左边/宽度,距离上边/高度,识别宽度/宽度,识别高度/高度)
float width = SCREEN_WIDTH*500.f/750.f;  //扫描宽度:屏幕宽度的2/3
float height = SCREEN_WIDTH*500.f/750.f; //扫描宽度:屏幕宽度的2/3
float scanV_X = (SCREEN_WIDTH-width)/2.f;
float scanV_Y = (SCREEN_HEIGHT-height)/2.f;
CGRect scanViewRect = CGRectMake(scanV_X/SCREEN_WIDTH, scanV_Y/SCREEN_HEIGHT, width/SCREEN_WIDTH, height/SCREEN_HEIGHT);
readerVC.scanCrop = scanViewRect;

//readerVC.scanCrop = CGRectMake(0, 0, 1, 1);//扫描范围:屏幕大小


//设置识别的参数   根据需求调整,可以提高识别速度。
ZBarImageScanner *scanner = readerVC.scanner;
[scanner setSymbology:ZBAR_I25 //此参数和“to"后面的参数配合 确定了识别的编码范围
               config:ZBAR_CFG_ENABLE
                   to:0];
[self presentViewController:readerVC animated:YES completion:nil];



协议方法:

#pragma mark - ZBarReaderDelegate
-(void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info {
    id<NSFastEnumeration> results =[info objectForKey:ZBarReaderControllerResults];
    ZBarSymbol *symbol =nil;
    for(symbol in results)
        break;
    NSLog(@"%@",symbol.data);//打印识别的数据
    [reader dismissViewControllerAnimated:YES completion:^{
    
    }];

}

效果:

初次,会提示“访问相机权限:


初次,会提示“访问相机权限”


之后,可以扫描



返回结果:

2017-09-12 21:41:48.586385 scanVC[3952:1369923] http://r.m.baidu.com/3ii99ns


放在屏幕中央位置,才扫描成功!!!
因为设置了识别范围


当然,这种扫描的信息是 直接加载网址

获取到的二维码内部信息是一些参数,需要处理这些参数!这就是不同APP的处理了!


Demo获取二维码信息
真机测试,参考:《开发者账号 真机测试》、《个人账号 真机测试








B.继承ZBarReaderViewController

继承成功的“ScanQRViewController.h”内部:

#import <ZBarSDK/ZBarSDK.h> //头文件

@interface ScanQRViewController : ZBarReaderViewController

@end



使用:push到扫描界面

ScanQRViewController * readerQR_VC = [[ScanQRViewController alloc] init];
readerQR_VC.title = @"XXXXX";
readerQR_VC.readerDelegate = self;

//设置识别的参数   根据需求调整,可以提高识别速度。
ZBarImageScanner * scanner = readerQR_VC.scanner;
[scanner setSymbology:ZBAR_I25 //此参数和“to"后面的参数配合 确定了识别的编码范围
           config:ZBAR_CFG_ENABLE
               to:0];

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

协议方法:里面处理扫描到的信息!

#pragma mark - ZBarReaderDelegate 
-(void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info {
    id<NSFastEnumeration> results =[info objectForKey:ZBarReaderControllerResults];
    ZBarSymbol *symbol =nil;
    for(symbol in results)
        break;
    NSLog(@"%@",symbol.data);//打印识别的数据
    [reader.navigationController popViewControllerAnimated:YES];

}




在“ScanQRViewController.m”内部:

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    //显示状态栏
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}


- (void)viewDidLoad {
    [super viewDidLoad];

    self.showsZBarControls = NO; //隐藏控制项
    self.tracksSymbols = NO; //隐藏追踪框

//设置识别范围(距离左边/宽度,距离上边/高度,识别宽度/宽度,识别高度/高度)
    float width = SCREEN_WIDTH*500.f/750.f;
    float height = SCREEN_WIDTH*500.f/750.f;
    float scanV_X = (SCREEN_WIDTH-width)/2.f;
    float scanV_Y = (SCREEN_HEIGHT-height)/2.f;
    CGRect scanViewRect = CGRectMake(scanV_X/SCREEN_WIDTH, scanV_Y/SCREEN_HEIGHT, width/SCREEN_WIDTH, height/SCREEN_HEIGHT);
    self.scanCrop = scanViewRect;


    [self setMaskViewAndScanAnimation];
}


-(void)setMaskViewAndScanAnimation {
    //掩盖视图maskView
    UIView * maskView = [[UIView alloc] initWithFrame:SCREEN_Bounds];
    maskView.backgroundColor = [UIColor clearColor];
    self.cameraOverlayView = maskView;//添加蒙版视图

    //扫描范围
    float width = SCREEN_WIDTH*500.f/750.f;
    float height = SCREEN_WIDTH*500.f/750.f;
    UIView * scanBoxV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
    scanBoxV.backgroundColor = [UIColor clearColor];//透明色才能扫描
    scanBoxV.center = maskView.center;
    [maskView addSubview:scanBoxV];
    scanBoxV.layer.borderWidth = 2.f;
    scanBoxV.layer.borderColor = ChosedColor.CGColor;


    //扫描动画 (根据UI需求:放图片或试图)
    UIImageView *lineImgV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, width, 3)];
    [scanBoxV addSubview:lineImgV];
    lineImgV.image = [UIImage imageNamed:@"scan_line"];
    [UIView beginAnimations:@"animationID" context:NULL];
    [UIView setAnimationDuration:3.f];

    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:lineImgV cache:YES];
    [UIView setAnimationRepeatCount:100];//重复次数

    [lineImgV setFrame:CGRectMake(0, 0+width, width, 3)]; //最终位置
    [UIView commitAnimations];
}

效果:




由于获取二维码信息这一块,已经被实现了!我们的工作就只有处理 二维码信息了!

#pragma mark - ZBarReaderDelegate      二维码信息获取
-(void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info {
   id<NSFastEnumeration> results =[info objectForKey:ZBarReaderControllerResults];
   ZBarSymbol *symbol =nil;
   for(symbol in results)
       break;
   NSLog(@"%@",symbol.data);//打印识别的数据
   //[reader.navigationController popViewControllerAnimated:YES];
}

即:根据我们APP的需要,对获取的信息(symbol.data)进行处理、封装!





闪光灯

- (void)viewDidLoad { }里面:

//闪光灯按钮
_flashLightBtn = [[UIButton alloc] init];
[_flashLightBtn addTarget:self action:@selector(openOrCloseFlashLight) forControlEvents:UIControlEventTouchUpInside];
[_flashLightBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];//字体颜色
[_flashLightBtn setTitle:@"闪光灯:打开" forState:UIControlStateNormal];//正常状态标题
[_flashLightBtn setTitle:@"闪光灯:关闭" forState:UIControlStateSelected];//选中状态标题
[maskView addSubview:_flashLightBtn];
[_flashLightBtn mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerX.equalTo(maskView);
    make.bottom.equalTo(maskView).with.offset(-SCREEN_WIDTH*30.f/750.f);
    make.width.mas_equalTo(SCREEN_WIDTH*1.f/2.f);
    make.height.mas_equalTo(SCREEN_WIDTH*60.f/750.f);
}];


//关闭闪光灯(进入后)
readerView.torchMode = 0;

-(void)openOrCloseFlashLight {
     if (_flashLightBtn.selected == YES) { 
        //当前:点亮状态
        readerView.torchMode = 0;//关闭
        _flashLightBtn.selected = NO;
    } else { //当前:关闭状态
        readerView.torchMode = 1;//打开
        _flashLightBtn.selected = YES;
    }

}

效果:


闪光灯











goyohol's essay

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 最近做了个外包项目,里面用到了二维码扫描和微信支付!之前比较熟悉的是ZXing,但是在Xcode7.1里面发现竟然...
    奔跑的小蚂蚁_8b28阅读 2,219评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,602评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,858评论 25 707
  • 【BGM】飞儿乐队《爱过》 最后一排还有空位,像是专门为这位迟来的同学准备的。乔安伊同学款款走过柒月所在的那个走廊...
    趁早退场阅读 329评论 0 3