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

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

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

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

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

  1. //先判断是否能将 输入输出设备 添加到会话中
  2. if !session.canAddInput(deviceInput) {
  3. return
  4. }
  5. if !session.canAddOutput(deviceOutput){
  6. return
  7. }
  8. //将设备添加到 会话中
  9. session.addInput(deviceInput)
  10. session.addOutput(deviceOutput)

3.设置允许扫描类型

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

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

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

5.开始会话

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

6.添加图层 实现预览

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

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

7.1创建一个图层预留使用

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

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

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

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

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

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

  1. /*绘制图形方法
  2. codeObject 存储二维码位置
  3. */
  4. private func Drawing(codeObject:AVMetadataMachineReadableCodeObject){
    //判断 如果没有值就不必要执行了
  5. if codeObject.corners.isEmpty{
  6. return
  7. }
  8.  
  9. var index:Int = 0 //标记
  10. let count:Int = codeObject.corners.count //数组corners中的个数 用于取值
  11.  
  12. //1.创建图层
  13. let layer = CAShapeLayer()
  14.  
  15. //2.设置图层属性
  16. layer.borderWidth = 4 //边框宽度
  17. layer.strokeColor = UIColor.greenColor().CGColor //边框颜色
  18. layer.fillColor = UIColor.clearColor().CGColor //框内内部颜色
  19.  
  20. //3.设置路径
  21. //创建一个 存储的 点 和 路径
  22. let path = UIBezierPath()
  23. var point = CGPointZero
  24.  
  25. //是一个 二维码四点 的数组
  26. print(codeObject.corners) //打印出来一看就明白
  27.  
  28. //移动到第一个点
  29. CGPointMakeWithDictionaryRepresentation((codeObject.corners[index++] as! CFDictionaryRef), &point)
  30. path.moveToPoint(point)
  31.  
  32. //循环取出其中的字典 转换成 点 放到path中
  33. while index < count {
  34. //从字典中拿出 点
  35. CGPointMakeWithDictionaryRepresentation((codeObject.corners[index++] as! CFDictionaryRef), &point)
  36.  
  37. path.addLineToPoint(point)
  38. }
  39.  
  40. //关闭路径
  41. path.closePath()
  42.  
  43. //绘制路径
  44. layer.path = path.CGPath
  45. //4.图层添加到drawingLayer上
  46. drawingLayer.addSublayer(layer)
  47. }

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

  1. //清空drawingLayer
  2. private func clearDrawing() {
  3. //先判断其中是否有绘图
  4. if drawingLayer.sublayers?.count == || drawingLayer.sublayers == nil
  5. {
  6. return
  7. }
  8.  
  9. //清空子控件
  10. for layerdraw in drawingLayer.sublayers!
  11. {
  12. layerdraw.removeFromSuperlayer()
  13. }
  14. }

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. 浏览器桌面通知Notification探究

    首先说明,这篇博文不是科普讲解的,而是立flag研究的,是关于浏览器消息自动推送,就是下面这个玩意: 最近常常在浏览器看到这样的消息推送,还有QQ.com的推送,现在我对这个不了解,不知道叫消息自动推 ...

  2. 【转载】HTTP 错误 500.19 - Internal Server Error

    windows 2008下IIS7 安装ASP.NET 遇到如下错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. ...

  3. C#骏鹏自动售货机接口

    MachineJP类: 第1部分:串口初始化,串口数据读写 using System; using System.Collections.Generic; using System.IO.Ports; ...

  4. C#中WinForm窗体事件的执行次序

    C#中WinForm窗体事件的执行次序如下: 当 Windows Form 应用程序启动时,会以下列顺序引发主要表单的启动事件:        System.Windows.Forms.Control ...

  5. 开启MySQL日志

    找到my.ini(Linux下是my.cnf)文件,在文件里加入下面两行: log="F:/mysqllog/mysql.log" log-bin="F:/mysqllo ...

  6. MySQL 语句大全--------添加列,修改列,删除列

    ALTER TABLE:添加,修改,删除表的列,约束等表的定义. 查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table ...

  7. Markdown生成左边框目录

    自从接触了Markdown后就一直用这种语言写学习笔记. 但是一直在纠结如何生成方便的目录. 下面是我搞得一个简单的模板可以生成固定在屏幕左边的目录. 就是这种 第一步,编辑器 首先,需要一个可以自动 ...

  8. FileIputeStream用于读写文件,并且用字节的方式表示出来

    package com.Java; import java.io.FileInputStream; import java.io.FileNotFoundException; import java. ...

  9. go语言 类型:字符串

    示例 package main import ( "fmt" ) func main() { var str1 string // 声明一个字符串变量 str1 = "H ...

  10. javascript笔记图

    1.this 2.对象 3.继承 4.跨域 5.事件 6.基础