本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW。细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了。这个代码自己写就行了,与本文关系不大。。。绿色的线会上下跑,不要担心:D

实现效果如下:

  1.在工程中添加框架AVFoundation.framework

  2.声明代理:AVCaptureMetadataOutputObjectsDelegate 。 define 几个东东用来画框、画线:

#define SCANVIEW_EdgeTop 40.0
#define SCANVIEW_EdgeLeft 50.0
#define TINTCOLOR_ALPHA 0.2 //浅色透明度
#define DARKCOLOR_ALPHA 0.5 //深色透明度
#define VIEW_WIDTH [UIScreen mainScreen].bounds.size.width
#define VIEW_HEIGHT [UIScreen mainScreen].bounds.size.height

  3.声明以下属性:

    AVCaptureSession * session;//输入输出的中间桥梁
UIView *AVCapView;//此 view 用来放置扫描框、取消按钮、说明 label
UIView *_QrCodeline;//上下移动绿色的线条
NSTimer *_timer;

  4.在某个方法中(我是点击扫描按钮)创建扫描界面,开始扫描:

 //创建一个 view 来放置扫描区域、说明 label、取消按钮
UIView *tempView = [[UIView alloc]initWithFrame:CGRectMake(, , , [UIScreen mainScreen].bounds.size.height )];
AVCapView = tempView;
AVCapView.backgroundColor = [UIColor colorWithRed:.f/ green:.f/ blue:.f/ alpha:]; UIButton *cancelBtn = [[UIButton alloc]initWithFrame:CGRectMake(, [UIScreen mainScreen].bounds.size.height - , , )];
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )];
label.numberOfLines = ;
label.text = @"小提示:将条形码或二维码对准上方区域中心即可";
label.textColor = [UIColor grayColor];
[cancelBtn setTitle:@"取消" forState: UIControlStateNormal];
[cancelBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[cancelBtn addTarget:self action:@selector(touchAVCancelBtn) forControlEvents:UIControlEventTouchUpInside];
[AVCapView addSubview:label];
[AVCapView addSubview:cancelBtn];
[self.view addSubview:AVCapView]; //画上边框
UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop, VIEW_WIDTH- * SCANVIEW_EdgeLeft, )];
topView.backgroundColor = [UIColor whiteColor];
[AVCapView addSubview:topView]; //画左边框
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop , ,VIEW_WIDTH - * SCANVIEW_EdgeLeft )];
leftView.backgroundColor = [UIColor whiteColor];
[AVCapView addSubview:leftView]; //画右边框
UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft + VIEW_WIDTH- * SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop , ,VIEW_WIDTH - * SCANVIEW_EdgeLeft + )];
rightView.backgroundColor = [UIColor whiteColor];
[AVCapView addSubview:rightView]; //画下边框
UIView *downView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop + VIEW_WIDTH- * SCANVIEW_EdgeLeft,VIEW_WIDTH - * SCANVIEW_EdgeLeft , )];
downView.backgroundColor = [UIColor whiteColor];
[AVCapView addSubview:downView]; //画中间的基准线
_QrCodeline = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft + , SCANVIEW_EdgeTop, VIEW_WIDTH- * SCANVIEW_EdgeLeft - , )];
_QrCodeline.backgroundColor = [UIColor greenColor];
[AVCapView addSubview:_QrCodeline]; // 先让基准线运动一次,避免定时器的时差
[UIView animateWithDuration:1.2 animations:^{ _QrCodeline.frame = CGRectMake(SCANVIEW_EdgeLeft + , VIEW_WIDTH - * SCANVIEW_EdgeLeft + SCANVIEW_EdgeTop , VIEW_WIDTH - * SCANVIEW_EdgeLeft - , ); }]; [self performSelector:@selector(createTimer) withObject:nil afterDelay:0.4]; 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()]; //初始化链接对象
session = [[AVCaptureSession alloc]init];
//高质量采集率
[session setSessionPreset:AVCaptureSessionPresetHigh]; [session addInput:input];
[session addOutput:output];
//设置扫码支持的编码格式(如下设置条形码和二维码兼容)
output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]; AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
layer.frame = CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop, VIEW_WIDTH- * SCANVIEW_EdgeLeft, );
[AVCapView.layer insertSublayer:layer atIndex:];
//开始捕获
[session startRunning];

  5.实现定时器、还有基准线的滚动方法

- (void)createTimer
{
_timer=[NSTimer scheduledTimerWithTimeInterval:1.1 target:self selector:@selector(moveUpAndDownLine) userInfo:nil repeats:YES];
} - (void)stopTimer
{
if ([_timer isValid] == YES) {
[_timer invalidate];
_timer = nil;
} } // 滚来滚去 :D :D :D
- (void)moveUpAndDownLine
{
CGFloat YY = _QrCodeline.frame.origin.y; if (YY != VIEW_WIDTH - * SCANVIEW_EdgeLeft + SCANVIEW_EdgeTop ) {
[UIView animateWithDuration:1.2 animations:^{
_QrCodeline.frame = CGRectMake(SCANVIEW_EdgeLeft + , VIEW_WIDTH - * SCANVIEW_EdgeLeft + SCANVIEW_EdgeTop , VIEW_WIDTH - * SCANVIEW_EdgeLeft - ,);
}];
}else {
[UIView animateWithDuration:1.2 animations:^{
_QrCodeline.frame = CGRectMake(SCANVIEW_EdgeLeft + , SCANVIEW_EdgeTop, VIEW_WIDTH - * SCANVIEW_EdgeLeft - ,);
}]; }
}

6.扫描成功后,想干嘛干嘛,就在这个代理方法里面实现就行了

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
if (metadataObjects.count>) {
//[session stopRunning];
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : ];
//输出扫描字符串
NSLog(@"%@",metadataObject.stringValue);
[session stopRunning];
[self stopTimer];
[AVCapView removeFromSuperview];
.....
}
}

7.如果用户不想扫描了,点击取消按钮:

- (void)touchAVCancelBtn{
[session stopRunning];//摄像也要停止
[self stopTimer];//定时器要停止
[AVCapView removeFromSuperview];//刚刚创建的 view 要移除 ...
}

iOS系统原生二维码条形码扫描的更多相关文章

  1. iOS系统原生 二维码的生成、扫描和读取(高清、彩色)

    由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维 ...

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

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

  3. iOS:原生二维码扫描

    做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framewo ...

  4. iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码

    iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...

  5. 使用IOS7原生API进行二维码条形码的扫描

    使用IOS7原生API进行二维码条形码的扫描 IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析 ...

  6. iOS 原生二维码扫描和生成

    代码地址如下:http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工 ...

  7. iOS- 详解如何使用ZBarSDK集成扫描二维码/条形码,点我!

    1.前言 目前市场主流APP里,二维码/条形码集成主要分两种表现形式来集成: a. 一种是调用手机摄像头并打开系统照相机全屏去拍摄 b. 一种是自定义照相机视图的frame,自己控制并添加相关扫码指南 ...

  8. ios7 苹果原生二维码扫描(和微信类似)

    在ios7苹果推出了二维码扫描,以前想要做二维码扫描,只能通过第三方ZBar与ZXing. ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二维码” 的扫描确很困 ...

  9. iOS 自带二维码扫描功能的实现

    自从iOS7以后中新增了二维码扫描功能.因此可以在不借助第三方类库的情况下简单的写出二维码的扫描功能: 原生的二维码扫描功能在AVFoundation框架下,所以在使用原生的二维码扫描功能时要先导入A ...

随机推荐

  1. C iOcp

    #include <winsock2.h> //#include <windows.h> #include <stdio.h> #define PORT 5150 ...

  2. Ubuntu Server 14.04在VMware安装的一些事儿

    这几天一直在折腾Ubuntu Server 14.04,故记录下: 安装前的准备: 1.建议安装英文版,像15.04.16.04等安装中文版时存在bug,而且中文版字体显示也有问题. 2.Ubuntu ...

  3. BASE64URL解析

    BASE64URL是一种在BASE64的基础上编码形成新的加密方式,为了编码能在网络中安全顺畅传输,需要对BASE64进行的编码,特别是互联网中. BASE64URL编码的流程: .明文使用BASE6 ...

  4. ExpandableListView(一)替换系统默认的箭头

    很多朋友可能在android开发中,用过ExpandableListView这个组件,这个组件功能强大,比传统的ListView有好多优势.然而在开发中,我相信有好多人,包括我个人都会遇到下面的一些问 ...

  5. 1396 - Most Distant Point from the Sea

    点击打开链接 题意: 按顺序给出一小岛(多边形)的点 求岛上某点离海最远的距离 解法: 不断的收缩多边形(求半平面交) 直到无限小 二分收缩的距离即可 如图 //大白p263 #include < ...

  6. Java图形化界面设计——布局管理器之GridLayout(网格布局)

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...

  7. 【HDU】病毒侵袭持续中(AC自己主动机+map)

    一開始一直WA,之后发现这道题不止一组输入,改成多组输入之后就过了. 利用map把每一个字符串映射到它相应的结点上即可了. 11909467 2014-10-19 11:54:00 Accepted ...

  8. 笔记-Nodejs中的核心API之Events

    最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的 ...

  9. ViewState是什么

    在做ASP.NET的时候遇到ViewState,当时不知道他是什么意思. 就在当前页面中保存数据的. 像session.是会话级别的.只要会话没有过期.session中存的数据就在. viewstat ...

  10. solr6环境搭建

    1.下载并安装jdk1.8,配置环境变量 2.下载并安装tomcat8(8以上) 3.下载solr源码,转变部署solr a)[solr-6.2.0\server\solr-webapp]下的weba ...