开发当中我们经常遇到二维码的生成或者说是扫描,但是苹果官方给我们准备好了这些 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)
}