- 二维码需要用到库AVFoundation
导入库完毕后,按照下面几个步骤来做
1234567891011121314151617181920212223242526272829/// 1.创建输入private lazy var inputDevice: AVCaptureDeviceInput? ={let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)do{let input = try AVCaptureDeviceInput(device: device)return input}catch{return nil}}()/// 2.创建输出private lazy var output: AVCaptureMetadataOutput = {let output = AVCaptureMetadataOutput()return output}()/// 3.创建会话private lazy var session: AVCaptureSession = {let s = AVCaptureSession()s.sessionPreset = "AVCaptureSessionPreset1920x1080"return s}()/// 4.创建预览图层private lazy var previewLayer: AVCaptureVideoPreviewLayer = {let layer = AVCaptureVideoPreviewLayer(session: self.session)layer.frame = UIScreen.mainScreen().boundsreturn layer}()代理捕捉扫描信息
12345678extension QRCodeViewController: AVCaptureMetadataOutputObjectsDelegate{func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!){NJLog(metadataObjects.last?.stringValue)}}启动扫描
123456789101112131415161718192021222324252627private func startScanQRCode(){// 1.判断是否可以添加输入设备if !session.canAddInput(inputDevice){return}// 2.判断是否可以添加输出对象if !session.canAddOutput(output){return}// 3.添加输入和输出到会话中session.addInput(inputDevice)session.addOutput(output)// 4.设置输出解析数据类型// 必须在输出对象添加到会话之后才可以设置, 否则会报错output.metadataObjectTypes = output.availableMetadataObjectTypes// 5.设置输出代理, 监听解析到得结果output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())// 6.添加预览图层view.layer.insertSublayer(previewLayer, atIndex: 0)// 将绘制边框图层添加到预览图层上 previewLayer.addSublayer(drawLayer)// 6.利用会话开始扫描session.startRunning()}设置感兴趣范围
12345678910111213/// 2.创建输出private lazy var output: AVCaptureMetadataOutput = {let output = AVCaptureMetadataOutput()// 设置兴趣点(感兴趣范围), 默认是全屏// 注意: 是以横屏的左上角为参照// output.rectOfInterest = CGRect(x: 0, y: 0, width: 0.5, height: 0.5)let frame = self.containerView.framelet size = self.view.frame.size// 由于是按照横屏来计算的, 所以需要将x变为y, y变为x, 将宽变为高, 高变为宽output.rectOfInterest = CGRect(x: frame.origin.y / size.height, y: frame.origin.x / size.width, width: frame.size.height / size.height, height: frame.size.width / size.width)return output}()描绘边框
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!){// 0. 移除以前的描边clearCorners()for objc in metadataObjects{// 1.将扫描到二维码的坐标转换为我们能够识别的坐标let codeObjc = previewLayer.transformedMetadataObjectForMetadataObject(objc as! AVMetadataObject)// 2.根据转换好的坐标绘制二维码描边drawCorners(codeObjc as! AVMetadataMachineReadableCodeObject)}}///绘制二维码描边private func drawCorners(codeObjc: AVMetadataMachineReadableCodeObject){if codeObjc.corners == nil || codeObjc.corners.count == 0{return}// 1.绘制路径let subLayer = CAShapeLayer()subLayer.lineWidth = 4subLayer.strokeColor = UIColor.redColor().CGColorsubLayer.fillColor = UIColor.clearColor().CGColor// 2.从传入对象中获取4个点, 创建Pathlet path = UIBezierPath()var point = CGPointZerovar index = 0let dictArr = codeObjc.corners// 2.1取出第0个点// 将字典中的xy转换为CGPointCGPointMakeWithDictionaryRepresentation(dictArr[index++] as! CFDictionaryRef, &point)// 2.2移动到第0个点path.moveToPoint(point)// 2.3添加其它的点while index < dictArr.count{CGPointMakeWithDictionaryRepresentation(dictArr[index++] as! CFDictionaryRef, &point)path.addLineToPoint(point)}// 2.4关闭路径path.closePath()subLayer.path = path.CGPath// 3.将layer添加到drawLayer上drawLayer.addSublayer(subLayer)}/// 移除以前的描边private func clearCorners(){if drawLayer.sublayers == nil || drawLayer.sublayers?.count == 0{return}for subLayer in drawLayer.sublayers!{subLayer.removeFromSuperlayer()}}
二维码创建
根据信息创建二维码
1234567891011121314151617// 1.生成二维码// 1.创建滤镜let filter = CIFilter(name: "CIQRCodeGenerator")!// 2.还原滤镜默认设置filter.setDefaults()// 3.设置数据filter.setValue("极客江南".dataUsingEncoding(NSUTF8StringEncoding), forKey: "inputMessage")// 4.从滤镜从取出二维码let ciImage = filter.outputImage!// customImageView.image = UIImage(CIImage: ciImage)// customImageView.image = createNonInterpolatedUIImageFormCIImage(ciImage, size: 500)let QRCodeImage = createNonInterpolatedUIImageFormCIImage(ciImage, size: 500)// 5.设置图片到界面上image.image = QRCodeImage生成高清放大的图像
|
|