开发当中我们经常遇到二维码的生成或者说是扫描,但是苹果官方给我们准备好了这些 API,那么接下来作者为大家详细讲述一下二维码

在二维码的生成中,我们要用到一个类CIFilter,这是系统的一个滤镜类,可以用来做各种的滤镜,但是个人感觉比较卡,做滤镜的话还是建议大家用 GUPImage这个第三方框架的好,因为这个框架完全是涉及 CUP 的运行,效率非常快

以下这个例子是为百度网站生成一个二维码,同学们也可以自己换一个地址试试

 // 实例化二维码滤镜对象
let filter = CIFilter(name: "CIQRCodeGenerator")// 恢复滤镜默认对象属性(因为可能滤镜会保存上一次的属性)
filter.setDefaults()// 将字符串转换成NSdata
let data = "https://www.baidu.com".dataUsingEncoding(NSUTF8StringEncoding)// 通过 KVO设置滤镜,传入 data,滤镜就会将传入的二进制数据 data 转换成生成二维码
filter.setValue(data, forKey: "inputMessage")// 生成二维码图片,但是这个是 CIImage
let outputImage = filter.outputImage// 将 CIIimage 转换成UIImage 并显示出来
self.imageView.image = UIImage(CIImage: outputImage)

二维码的扫描分以下好几步
1.导入AVFoundation框架
2.实例化拍摄设备
3.设置元数据输出
4.添加拍摄回话(相当于一个桥梁,把上面的输入和输出连接起来)
5.显示视觉预览图层
6.设置界面显示扫描结果

按照这个思路,我们开始创建代码

1.导入AVFoundation框架

import AVFoundation
var session:AVCaptureSession!
var previewLayer:AVCaptureVideoPreviewLayer!

2.实例化拍摄设备

// 1.实例化拍摄设备(告诉系统,你想用哪一种拍摄设备)
let device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)// 2.设置输入设备let input = AVCaptureDeviceInput.deviceInputWithDevice(device, error: nil) as! AVCaptureDeviceInput

3.设置元数据输出

// 3.1 实例化拍摄元数据输出
var output = AVCaptureMetadataOutput.new()// 3.2设置输出数据代理,当然控制器要遵循AVCaptureMetadataOutputObjectsDelegate这个代理来调用扫描完成后元数据输出的代理方法
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()!) // 这里设置主线程和子线程都没有关系

4.添加拍摄回话(相当于一个桥梁,把上面的输入和输出连接起来)

// 4.1 实例化拍摄会话
self.session = AVCaptureSession.new()
// 4.2 添加会话输入
self.session.addInput(input)
// 4.3 添加会话输出
self.session.addOutput(output)// 4.4 设置输出数据的类型,将元数据输出添加会话后,才能指定元数据类型,否则会报错
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode] // 这里设置元数据输出类型为二维码

5.显示视觉预览图层

// 5.1 实例化预览图层,传递 session 是为了告诉图层将来要显示什么内容
self.previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(self.session) as! AVCaptureVideoPreviewLayer// 设置图层的显示范围
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
self.previewLayer.frame = self.view.bounds// 5.2 将图层插入当前视图
self.view.layer.insertSublayer(self.previewLayer, atIndex: 100)
 // 启动会话
self.session.startRunning()

6.设置界面显示扫描结果

// 当二维码扫描后就会调用这个代理方法func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {// 1.扫描完成,停止会话self.session.stopRunning() // 如果不停止会话,系统会不断扫描,调用代理方法// 2.删除预览图层self.previewLayer.removeFromSuperlayer()// 3.设置界面显示扫描结果if metadataObjects.count > 0 {let obj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject // 二维码对象// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!print(obj.stringValue)}

IOS 开发笔记——二维码的生成和扫描相关推荐

  1. 二维码的生成和扫描识别

    一.二维码的生成  1 #import "ViewController.h"  2 #import "QRCodeGenerator.h"  3   4 @in ...

  2. iOS开发——扫二维码下载APP

    注意:苹果手机只有UDID被加入到开发者的设备中之后才可以扫描二维码安装否则不能安装,如果没有请将UDID加入到开发者设备中重新下载证书点击运行就可以了(电脑证书不用动). 查看苹果设备UDID并添加 ...

  3. QR Code 二维码的生成与扫描

    前言 现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件. 最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲述如何使用ZXing库,在项目中要使用 ...

  4. 条形码、二维码的生成与扫描、解析本地二维码

    Github项目解析(十)–>几行代码快速集成二维码扫描库 - CSDN博客 http://blog.csdn.net/qq_23547831/article/details/52037710 ...

  5. Android 使用Zxing实现二维码的生成,扫描

    在项目中要使用到二维码的相关内容,百度(原谅我还在用)之后得知一半都是使用Google的开源库 Zxing,但是网上多半的使用教程都是比较早的,这里给出我总结的一些基础代码和使用规则: 首先要一定要先 ...

  6. IOS --自带二维码扫描

    2019独角兽企业重金招聘Python工程师标准>>> 具体的可以参考这篇文章:http://www.appcoda.com/qr-code-ios-programming-tuto ...

  7. 【Android】实现生成二维码、条形码和扫描二维码的功能

    目录 一.添加依赖 二.布局文件 三.实现生成二维码的功能 四.效果图 一.添加依赖 要先添加一个第三方库来实现二维码的生成以及扫描二维码的功能,开源库如下: 在build.grade(Moudle) ...

  8. iOS开发 - 二维码的生成与读取

    二维码的生成 从iOS7開始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk眼下不支持64位处理器 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 二维 ...

  9. iOS原生封装二维码、条形码扫描工具;生成、识别(彩色)二维码、条形码图片

    二维码扫描在App中很常见的功能,之前都是用三方工具Zing.ZBar.后来Apple的AVFoundation也支持二维码扫描.生成,而且效率比三方库还要高.我把它封装成一个工具,这样使用起来十分方 ...

最新文章

  1. 在php代码中加视频,php – 如何在laravel代码中嵌入视频
  2. 说说Nginx的核心技术和场景的使用方式!
  3. session多服务器共享的方案梳理
  4. pscs6插件_PS插件-灯光工厂
  5. Sqlce与SQL Server2000/2005数据转换程序
  6. 前端学习:Vue.js基本使用
  7. angular 注入器配置_Angular2 多级注入器详解及实例
  8. 利用PowerDesigner15在win7系统下对MySQL 进行反向project(二)
  9. Linq中常用的方法
  10. spark Transformations算子
  11. WdatePicker—WdatePicker日历控件使用方法
  12. 只要是[运算] 就会提升数据类型
  13. JS 中的call,apply,bind 和 caller, callee
  14. Java进行音视频转码
  15. webshell及木马详解
  16. 编程开发常用词汇(持续更新)
  17. 重装系统后如何恢复mysql服务
  18. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐
  19. BigDecimal 金额转换
  20. 如何防止网站被黑客入侵,避免网站被黑的防御方法

热门文章

  1. 《中谷项目》--第一滴血
  2. word2016 如何在分式中输入∑,如何使求和范围显示在上下方?
  3. 五种方法 前端代码实现九宫格布局
  4. 有了for循环 为什么还要forEach?
  5. 打印复印店复印100张资料需要多少钱
  6. UNIAPP点击动画 animation 点击动效
  7. 在x86-64系统上的函数调用过程(参考)
  8. IPv6有什么优势?
  9. linux - Three Swordsmen
  10. 【一文学会文件上传】SpringBoot+form表单实现文件上传