iOS二维码扫描的实现(Swift)
随着二维码的普遍使用,二维码扫描也成为了很多app的一个基本功能,本篇主要来介绍一下如何实现一个简单的二维码扫描功能。本文使用了XCode自带的AVFoundation
库,利用Swfit语言实现。
实现的步骤如下:
1.获取视频设备(Video)
在二维码扫描中,我们的输入流是视频。我们需要enable视频设备来获取相应的元数据。
2. 创建Session来处理视频的输入输出流
3. 创建输入输出流,并添加至Session中
4. 处理二维码数据
该方法是AVCaptureMetadataOutputObjectsDelegate的一个成员方法,我们需要实现它
~~~~~~~~~~~~~~~~~~~~~~~~~我是代码:)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// ViewController.swift
// QrCodeTest
//
// Created by XuAlvin on 2/2/16.
// Copyright © 2016年 XuAlvin. All rights reserved.
// import UIKit
import AVFoundation
class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate { var session:AVCaptureSession? override func viewDidLoad() {
super.viewDidLoad() //获取摄像设备,注意是Video而不是Audio
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
//初始化AV Session来协调和处理AV的输入和输出流
let session = AVCaptureSession() //创建输入流
let input:AVCaptureDeviceInput? = try! AVCaptureDeviceInput(device: device) if session.canAddInput(input){
session.addInput(input)
} //创建输出流
let output:AVCaptureMetadataOutput = AVCaptureMetadataOutput()
if session.canAddOutput(output){
session.addOutput(output)
//设置输出流代理,从接收端收到的所有元数据都会被传送到delegate方法,所有delegate方法均在queue中执行
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
//设置元数据的类型,这里是二维码QRCode
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
} //创建视频设备拍摄视频区域,本例中是全屏
let layer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: session)
layer.videoGravity = AVLayerVideoGravityResizeAspectFill
layer.frame=self.view.layer.bounds
self.view.layer.insertSublayer(layer, atIndex: 0)
//开始采集视频数据
session.startRunning()
} //实现AVCaptureMetadataOutputObjectsDelegate的成员方法来处理二维码信息
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
session?.stopRunning() //获取二维码信息元数据
if let metadataObjects = metadataObjects.first{
let readableObject = metadataObjects as! AVMetadataMachineReadableCodeObject //添加震动
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
//弹出二维码信息
let alertCtl : UIAlertController = UIAlertController(title: "二维码信息", message: readableObject.stringValue, preferredStyle: UIAlertControllerStyle.Alert) //添加action到uialertcontroller,action是UIalertcontroller上的按钮操作,建议至少添加一个,如果不添加,alertcontroller就没有相应的按钮退出 let alertAction : UIAlertAction = UIAlertAction(title: "Action", style: UIAlertActionStyle.Default, handler: { (param : UIAlertAction!) -> Void in
print("I am alert action") })
alertCtl.addAction(alertAction)
//显示alert controller
self.presentViewController(alertCtl, animated: true, completion: nil)
}
}
}
iOS二维码扫描的实现(Swift)的更多相关文章
- Ios二维码扫描(系统自带的二维码扫描)
Ios二维码扫描 这里给大家介绍的时如何使用系统自带的二维码扫描方法和一些简单的动画! 操作步骤: 1).首先你需要搭建UI界面如图:下图我用了俩个imageview和一个label 2).你需要在你 ...
- iOS二维码扫描IOS7系统实现
扫描相关类 二维码扫描需要获取摄像头并读取照片信息,因此我们需要导入系统的AVFoundation框架,创建视频会话.我们需要用到一下几个类: AVCaptureSession 会话对象.此类作为硬件 ...
- iOS - 二维码扫描和应用跳转
序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如ZXing或者ZBar.使用时集成麻烦, ...
- ios二维码扫描插件,适配当前主流扫描软件,自定义扫描界面。
二维码介绍: 二维码(QR(Quick Response)code),又称二维条码,最早起源于日本. 它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息 ...
- iOS 二维码扫描 通过ZBar ZXing等第三方库
扫描二维码的开源库有很多如 ZBar.ZXing等 ZBar的使用方法: 下载ZBar SDK 地址https://github.com/bmorton/ZBarSDK ZBarSDK是一个开源的SD ...
- ios二维码扫描
1.添加AVFoundation.framework框架 2,控制器中实现 //第一步添加AVFoundation.framework框架 #import "ViewController.h ...
- iOS 二维码扫描
// 导入 AVFoundation.framwork 框架#import "HDCodeViewController.h" #import "HDNormalViewC ...
- 有关iOS系统中调用相机设备实现二维码扫描功能的注意点(3/3)
今天我们接着聊聊iOS系统实现二维码扫描的其他注意点. 大家还记得前面我们用到的输出数据的类对象吗?AVCaptureMetadataOutput,就是它!如果我们需要实现目前主流APP扫描二维码的功 ...
- iOS开发-二维码扫描和应用跳转
iOS开发-二维码扫描和应用跳转 序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...
随机推荐
- ssh结合使用
springxml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=& ...
- centos7开机出现try again to boot into default maintenance give root password for maintenance
开启centos7出现下面两句话,然后直接输出root密码,就可以登录,但是登录后,发现一些文字显示出来的是乱码 try again to boot into default maintenanceg ...
- 解决:"2013-01-06 00:00:00" is not a valid date and time.
在转换时间格式时,遇到以下问题: 弹出对话框:"2013-01-06 00:00:00" is not a valid date and time. 在百度上查找,发现是本地日期格 ...
- cmd 中运行testng代码
说明:classpath是jvm执行class时所加载的路径:--个人理解,如有不同:QQ:316567803 1.先下载插件 https://plugins.jetbrains.com/plugin ...
- (二)Jmeter各部件的作用
JMeter主要组件介绍 1.测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组(Thread Group)代表一定数量的并发用户 ...
- Vue 小组件input keyup.enter绑定
<div id="todo-list-example"> <input v-model="newTodoText" v-on:keyup.en ...
- 清理elasticsearch的索引
curl -XDELETE 'http://172.16.1.16:9200/logstash-2013.03.*' 清理掉了所有 3月份的索引文件,其中*是通配符 下面是主页上的详细介绍,其他部分可 ...
- Kafka高可用实现
数据存储格式 Kafka的高可靠性的保障来源于其健壮的副本(replication)策略.一个Topic可以分成多个Partition,而一个Partition物理上由多个Segment组成. Seg ...
- UVAlive4255_Guess
题目很好很有意思. 告诉你n个序列中,任意一个连续子序列的和与0相比较的结果. 构造一个满足条件的序列. 对于从x->y这一段的和,如果大于0,那么sum[x]>sum[y-1],显然我们 ...
- 字符串使用replaceAll()方法报异常
对字符串使用replaceAll()方法替换 * ? + / | 等字符的时候会报以下异常 Dangling meta character '*' near index 0 这主要是因为这些符号在正则 ...