您的位置:首页 > 移动开发 > IOS开发

IOS 开发笔记——二维码的生成和扫描

2015-08-30 17:14 1011 查看
开发当中我们经常遇到二维码的生成或者说是扫描,但是苹果官方给我们准备好了这些 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)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: