随着微信的大量推广,越来越多的人会在生活中用到二维码这一个方便大家的功能。

因此,很多的app中也逐渐的都加入了二维码这个元素,今天先给大家介绍一下iOS7后系统自带自己可以手动设计的二维码扫描。

QRCodeViewController这个类是实现二维码扫描创建的类,今天我写的这个类似于官方文档中的实现,可以直接扫描二维码跳转到当前二维码对应的链接,如果是应用的话,会跳转到appStore中对应的应用详情。

除了这个,现在用的比较多的还有ZBarSDK等三方库,实现的效果要比自己写的这个漂亮,后面有机会的话,我会介绍一下ZBarSDK的用法以及经常遇到的问题和解决方法。

下面是主要实现:

#import "QRCodeViewController.h"

#import <AVFoundation/AVFoundation.h>

@interface QRCodeViewController () <AVCaptureMetadataOutputObjectsDelegate>

{

BOOL _isReading;

}

@property (weak, nonatomic) IBOutlet UIView *ShowView;

@property (nonatomic,strong) UIView *boxView;

//@property (nonatomic,assign) BOOL *isReading;

@property (nonatomic,strong) CALayer *scanLayer;

@property (nonatomic,strong) UILabel *urlLabel;

-(BOOL)startReading;

-(void)stopReading;

//捕捉会话

@property (nonatomic,strong) AVCaptureSession *captureSession;

//展示layer

@property (nonatomic,strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;

@end

@implementation QRCodeViewController

- (void)viewDidLoad {

[super viewDidLoad];

UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];

btn.frame = CGRectMake(0, 30, 50, 30);

[btn setImage:[UIImage imageNamed:@"return@2x"] forState:UIControlStateNormal];

[btn addTarget:self action:@selector(leftClicked) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:btn];

_captureSession = nil;

//_isReading = NO;

[self startReading];

}

-(void)leftClicked{

[self dismissViewControllerAnimated:YES completion:nil];

}

-(BOOL)startReading{

NSError *error = nil;

//1.初始化捕捉设备(AVCaptureDevice),类型为AVMediaTypeVideo

AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

//2.用captureDevice创建输入流

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

if (!input) {

NSLog(@"%@",[error localizedDescription]);

return NO;

}

//3.创建媒体数据输出流

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

//4.实例化捕捉会话

_captureSession = [[AVCaptureSession alloc]init];

//4.1将输入流添加到会话

[_captureSession addInput:input];

//4.2将媒体输出流添加到会话中

[_captureSession addOutput:captureMedataOutput];

//5.创建串行队列,并将媒体输出流添加到队列中

dispatch_queue_t dispatchQueue;

dispatchQueue = dispatch_queue_create("myQueue", NULL);

//5.1设置代理

[captureMedataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];

//5.2设置输出媒体数据类型为QRCode

[captureMedataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];

//6.实例化预览图层

_videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_captureSession];

//7.设置预览图层填充方式

[_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

//8.设置图层的frame

[_videoPreviewLayer setFrame:_ShowView.layer.bounds];

//9.将图层添加到预览view的图层上

[_ShowView.layer addSublayer:_videoPreviewLayer];

//10.设置扫描范围

captureMedataOutput.rectOfInterest = CGRectMake(0.2f, 0.2f, 0.8f, 0.8f);

//10.1. 设置扫描框

_boxView = [[UIView alloc]initWithFrame:CGRectMake(_ShowView.bounds.size.width * 0, _ShowView.bounds.size.height*0, _ShowView.bounds.size.width, _ShowView.bounds.size.height)];

_boxView.layer.borderColor = [UIColor greenColor].CGColor;

_boxView.layer.borderWidth = 1.0f;

[_ShowView addSubview:_boxView];

//10.2扫描线

_scanLayer = [[CALayer alloc]init];

_scanLayer.frame = CGRectMake(0, 0, _boxView.bounds.size.width, 2);

_scanLayer.backgroundColor = [UIColor cyanColor].CGColor;

[_boxView.layer addSublayer:_scanLayer];

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(moveScanLayer:) userInfo:nil repeats:YES];

[timer fire];

//11.开始扫描

[_captureSession startRunning];

return 1;

}

-(void)moveScanLayer:(NSTimer *)timer{

CGRect frame = _scanLayer.frame;

if (_boxView.frame.size.height <= _scanLayer.frame.origin.y) {

frame.origin.y = 0;

_scanLayer.frame = frame;

}

else{

frame.origin.y += 5;

[UIView animateWithDuration:0.1 animations:^{

_scanLayer.frame = frame;

}];

}

}

-(void)stopReading{

//    [_captureSession stopRunning];

//    _captureSession = nil;

//    [_scanLayer removeFromSuperlayer];

//    [_videoPreviewLayer removeFromSuperlayer];

}

#pragma mark - AVCaptureMetadataOutputObjectsDelegate

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

//判断是否有数据

if (metadataObjects !=nil && [metadataObjects count]>0) {

AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];

//判断回传的数据类型

if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {

[self performSelectorOnMainThread:@selector(setUrl:) withObject:[metadataObj stringValue] waitUntilDone:NO];

//[[UIApplication sharedApplication] openURL:url];

[self performSelectorOnMainThread:@selector(stopReading) withObject:nil waitUntilDone:NO];

_isReading = NO;

}

}

}

-(void)setUrl:(NSString *)text{

NSURL *url = [NSURL URLWithString:text];

[[UIApplication sharedApplication] openURL:url];

}

iOS 中二维码扫描的更多相关文章

  1. iOS 中二维码扫描(zxingObjc和原生)

    对于网上的第三方 ZXingObjC,自我感觉是对原生的AVFoundation中关于二维码部分的一个封装,大致看看ZXingObjC的内部实现其事和原生的实现相似的,里面都用到了AVFoundati ...

  2. Ios二维码扫描(系统自带的二维码扫描)

    Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...

  3. iOS二维码扫描IOS7系统实现

    扫描相关类 二维码扫描需要获取摄像头并读取照片信息,因此我们需要导入系统的AVFoundation框架,创建视频会话.我们需要用到一下几个类: AVCaptureSession 会话对象.此类作为硬件 ...

  4. iOS - 二维码扫描和应用跳转

    序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦, ...

  5. ios二维码扫描插件,适配当前主流扫描软件,自定义扫描界面。

            二维码介绍: 二维码(QR(Quick Response)code),又称二维条码,最早起源于日本. 它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息 ...

  6. iOS中二维码的生成与使用(入门篇)

    这里简单总结一下关于二维码的扫描与生成,用的是原生的AVFoundation框架,其实这个框架目前功能还是够用的,不过这里推荐一个二维码扫描的第三方(face++),网址就不贴了,直接度娘就OK,里面 ...

  7. iOS二维码扫描的实现(Swift)

    随着二维码的普遍使用,二维码扫描也成为了很多app的一个基本功能,本篇主要来介绍一下如何实现一个简单的二维码扫描功能.本文使用了XCode自带的AVFoundation 库,利用Swfit语言实现. ...

  8. ios中二维码的使用之二: 二维码的扫描

    二维码的扫描: 1,导入支持框架,<AVFoundation/AVFoundation.h> 2 ,扫描:

  9. ios中二维码的使用之一: 二维码的生成

    iOS在7之后,具备了原生的二维码生成API; 生成二维码的准备:  #import <CoreImage/CoreImage.h> 导入框架: 开始生成: //1- 创建过滤器 CIFi ...

随机推荐

  1. NodeJS+Mongodb+Express做CMS博客系统

    楼主正在用业余时间开发中-- ,目前的版本仅支持会员系统,尝鲜一下吧~ hi-blog 一个 nodejs+express+mongodb 的 cms 系统 怎么启动 默认你已经安装了 mongodb ...

  2. js-二维数组和多维数组

    一.二维数组的表示 myarray[][] 二.二维数组的定义 方法一: var a = new Array(); for(var i=0;i<3;i++){ //一维长度为3 a[i] = n ...

  3. 关于JQUERY操作XML问题!

    使用JQUERY操作XML方法: 1.$.get(”xml文件路径",function(data){}); 2.$.Post(”xml文件路径",function(data){}) ...

  4. [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项

    问题 怎么样创建一个路由,不管客户端传不传这个参数,都可以被成功匹配. 解决方案 ASP.NET WEB API 的集中式路由和属性路由都支持路由声明可选参数. 在用集中式路由中可以通过 RouteP ...

  5. Sql server脏读、更新丢失、不可重复读、幻象读问题及解决方案

    1.脏读:一个事务读到另外一个事务还没有提交的数据.解决方法:把事务隔离级别调整到READ COMMITTED,即SET TRAN ISOLATION LEVEL READ COMMITTED.这时我 ...

  6. IIS 503日志文件在哪

    概述  503:“服务不可用”错误是一个非自定义的错误,该错误表示服务器当前无法处理该请求. 可能原因:1.管理员可能关闭应用程序池以执行维护.2.当请求到达时应用程序池队列已满.3.应用程序池标识没 ...

  7. Asp.Net中动态页面转静态页面

    关于在Asp.Net中动态页面转静态页面的方法网上比较多.结合实际的需求,我在网上找了一些源代码,并作修改.现在把修改后的代码以及说明写一下. 一个是一个页面转换的类,该类通过静态函数Changfil ...

  8. ASP.NET或WinFrom中获取汉子的拼音首字母

    1.获得一个字符串的每个字的拼音首字母构成所需的字符串 #region  获取首字母 /// <summary>         /// 这个办法是用来获得一个字符串的每个字的拼音首字母构 ...

  9. 在博客中使用MathJax写数学公式

    前言 总结一些在博客园使用MathJax写数学公式的经验. 博客园 设置使用数学公式 进入你的博客:管理 > 选项 里面有个启用数学公式支持,选上后保存. 这时,你就可以在你的博客里写数学公式了 ...

  10. 利用jquery实现网页禁止鼠标右键、禁止复制

    很多时候,网站的内容辛苦写法被轻松复制,为了不让自己的劳动成果外流,可以利用禁止鼠标右键等方式保护自己的原创内容! 方式1:禁止鼠标右键操作 <script src="http://l ...