3.30看视频  学到了二维码简单的实现 还有一些动画的实现  今天就先记录一下二维码扫描的简单实现  不太好记手写一遍 学习的基础在于模仿嘛

创建一个实现二维码扫描的步骤

1.首先是懒加载创建 会话 输入设备  输出设备

    // 先倒入框架 AVFoundation
import AVFoundation
//通过懒加载 创建输入设备
private lazy var deviceInput: AVCaptureDeviceInput? = {
//获取设备摄像头
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
//使用摄像头为输入设备 创建时需要try一下因为有可能拿不到 摄像头所以返回值有可能为空 该对象为可选(?)类型
do{
let input = try AVCaptureDeviceInput(device: device)
return input
}catch{
print(error)
return nil
}
}()
//创建 会话/输出 比较简单 只需要创建一个对象
private lazy var session: AVCaptureSession = AVCaptureSession()
//创建 输出设备
private lazy var deviceOutput: AVCaptureMetadataOutput = AVCaptureMetadataOutput()
这么第一步 就准备完毕 扫描二维码的 整体就是 输出设备通过 会话来 拿到 输入设备的获取的值 再解析

2.实现扫描二维码  输入输出 添加到会话

        //先判断是否能将 输入输出设备 添加到会话中
if !session.canAddInput(deviceInput) {
return
}
if !session.canAddOutput(deviceOutput){
return
}
//将设备添加到 会话中
session.addInput(deviceInput)
session.addOutput(deviceOutput)

3.设置允许扫描类型

        //设置扫描类型  也就是设置输出设备能够解析的数据类型
//设置类型时 必须先把设备添加到会话 否则崩溃
deviceOutput.metadataObjectTypes = deviceOutput.availableMetadataObjectTypes
deviceOutput.availableMetadataObjectTypes 获取到所有的解析类型

4.实现代理 拿到扫描数据

          //设置代理 解析数据   queue线程
deviceOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())

5.开始会话

        //开始 执行会话
session.startRunning()

6.添加图层 实现预览

    //为了更好的操作体验 一般扫描二维码的时候都会加上 预览 和 二维码定位线
//还是懒加载
private lazy var previewLzyer: AVCaptureVideoPreviewLayer = {
//预览涂层 想要展示一个界面 界面展示数据 数据通过输入设备获取 会话中则存储了数据
//注: 闭包 访问外界对象 则需要带上self
let preview = AVCaptureVideoPreviewLayer(session: self.session)
preview.frame = UIScreen.mainScreen().bounds
return preview
}()
再把预览添加到 二维码界面,但是有可能遮挡到某些空间 则
 view.layer.insertSublayer(<#T##layer: CALayer##CALayer#>, atIndex: <#T##UInt32#>)
插入一个layer视图 在index 第几层

7.实现代理 绘制预览定位线

7.1创建一个图层预留使用

    //老样子先懒加载一个使用  创建一个绘制图层 添加到预览视图上毕竟定位框要在预览视图上定位
private lazy var drawingLayer: CALayer = {
let draw = CALayer()
draw.frame = UIScreen.mainScreen().bounds
return draw
}()

7.2 实现代理方法   第四步中已经说了遵守了那个协议

extension ScanCodeController: AVCaptureMetadataOutputObjectsDelegate{

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!
, fromConnection connection: AVCaptureConnection!){
//试着输出一下咱们获取到的数据 这里只是展示一下这个方法的用处
print(metadataObjects.last)
//获取二维码内容 这个是咱们需要的 url 先存起来
var str = metadataObjects.last?.stringValue;
}

7.3要绘制一个图形咱们必须要从 其中获取到二维码的4个点    接下来的操作还是在上面那个协议方法中

        //获取二维码位置 前面的打印中咱们就看的出其中的一些数据 是看不懂的 所以要转换一下
//转换坐标 先便利一下其中的内容
for objec in metadataObjects{
//判断数据是否为机器是识别类型
if objec is AVMetadataMachineReadableCodeObject{
//转换类型 将坐标系转换为界面可识别坐标
//转换AVMetadataObject's类型 转换为 预览层的坐标
let codeObject = previewLzyer.transformedMetadataObjectForMetadataObject(objec as! AVMetadataObject) as!
AVMetadataMachineReadableCodeObject
// print(codeObject) 试着输出一下咱们转换出的的东西 //绘制图形
Drawing(codeObject)
}
}

7.4接下来咱们就该绘制图形 并且添加到视图中  代码有点多写了一个方法Drawing(codeObject)

    /*绘制图形方法
codeObject 存储二维码位置
*/
private func Drawing(codeObject:AVMetadataMachineReadableCodeObject){
//判断 如果没有值就不必要执行了
if codeObject.corners.isEmpty{
return
} var index:Int = 0 //标记
let count:Int = codeObject.corners.count //数组corners中的个数 用于取值 //1.创建图层
let layer = CAShapeLayer() //2.设置图层属性
layer.borderWidth = 4 //边框宽度
layer.strokeColor = UIColor.greenColor().CGColor //边框颜色
layer.fillColor = UIColor.clearColor().CGColor //框内内部颜色 //3.设置路径
//创建一个 存储的 点 和 路径
let path = UIBezierPath()
var point = CGPointZero //是一个 二维码四点 的数组
print(codeObject.corners) //打印出来一看就明白 //移动到第一个点
CGPointMakeWithDictionaryRepresentation((codeObject.corners[index++] as! CFDictionaryRef), &point)
path.moveToPoint(point) //循环取出其中的字典 转换成 点 放到path中
while index < count {
//从字典中拿出 点
CGPointMakeWithDictionaryRepresentation((codeObject.corners[index++] as! CFDictionaryRef), &point) path.addLineToPoint(point)
} //关闭路径
path.closePath() //绘制路径
layer.path = path.CGPath
//4.图层添加到drawingLayer上
drawingLayer.addSublayer(layer)
}

7.5 清空绘图,否则会预览视图上会有多个定位框  放到绘图方法开始就行

    //清空drawingLayer
private func clearDrawing() {
//先判断其中是否有绘图
if drawingLayer.sublayers?.count == || drawingLayer.sublayers == nil
{
return
} //清空子控件
for layerdraw in drawingLayer.sublayers!
{
layerdraw.removeFromSuperlayer()
}
}

Swift 二维码扫描 简单实现的更多相关文章

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

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

  2. Swift AVFoundation 二维码扫描和生成

    项目最终不须要支持iOS6了(泪崩),在二维码扫描这一块,可以全然的放弃ZXing库,改用系统的AVFoundation了,拿swift写了个Demo,效果例如以下: github地址:点这里 有关A ...

  3. Swift:使用系统AVFoundation实现二维码扫描和生成

    系统提供的AVCaptureSession仅仅适用于iOS7.0以上的系统.之前的请用Zbar来替代 下载地址:http://download.csdn.net/detail/huobanbengku ...

  4. XAMARIN ANDROID 二维码扫描示例

    现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile  做一个简单的 Android 条码扫描示 ...

  5. [Unity3D]自制UnityForAndroid二维码扫描插件

    一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分 ...

  6. Android仿微信二维码扫描

    转载:http://blog.csdn.net/xiaanming/article/details/10163203 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一 ...

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

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

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

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

  9. 如何用MediaCapture解决二维码扫描问题

    二维码扫描的实现,简单的来说可以分三步走:“成像”.“截图”与“识别”. UWP开发中,最常用的媒体工具非MediaCapture莫属了,下面就来简单介绍一下如何利用MediaCapture来实现扫描 ...

随机推荐

  1. Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  2. html5的canvas绘制迷宫地图

    canvas标签一直是html5的亮点,用它可以实现很多东西.我想用它来绘画像迷宫那样的地图.借助到的工具有瓦片地图编辑器tiled(点击跳转到下载链接). 如图:如果你想要画像这样的迷宫地图,如果不 ...

  3. 基础复习 关于JS

    1,js是一门解释型语言,无需编译,编写js要知道当前对象有什么成员,未必所有成员都能点出来. 2,js大小写敏感,严格区分大小写. 3,弱类型语言,声明用var,字符串推荐使用单引号. 4,==要先 ...

  4. ab网站压力测试

    ab网站压力测试命令的参数.输出结果的中文注解    permalink 以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了.就是APACHE自带的测试工具AB( ...

  5. CSRF 攻击介绍

    CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/ ...

  6. Document

    每个载入浏览器的 HTML 文档都会成为 Document 对象.Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问.提示:Document 对象是 Window 对象的一 ...

  7. Light OJ 1031---Easy Game(区间DP)

    题目链接 http://lightoj.com/volume_showproblem.php?problem=1031 Description You are playing a two player ...

  8. PHP替代正则匹配的高效函数

    strpos() - 查找字符串首次出现的位置 strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写). strripos() 函数查找字符串在另一字符串中最后一次出现的位置 ...

  9. 解决WindowsServer 2008 R2 未注册版一个小时自动强制关机

    仅用来学习交流,请大家购买正版,尊重正版版权. 安装了win2008R2,试了很多激活方法,终于激活后,不知道什么原因,过了一段时间后,每隔一段时间就自动关机,查了一下,发现是 wlms.exe在作祟 ...

  10. Nivo Slider - 世界上最棒的 jQuery 图片轮播插件

    Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ...