IOS 控件 - Swift 集成 IOS 自带 API 扫描二维码
第一步:加入框架 AVFoundation.framework
目录选择 targets -> Build Phases -> Link Binary with Libraries 后,加入AVFoundation.framework即可
第二步:加入以下代码,并加入协议 AVCaptureMetadataOutputObjectsDelegate,
定义全局变量
var session: AVCaptureSession?;
var previewLayer: AVCaptureVideoPreviewLayer?;
在需要使用的地方 使用readQRCode()函数即可
func readQRCode() { //1.获取摄像头设备 var device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo); //2.设置输入 var error: NSError?; var input: AVCaptureDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as AVCaptureDeviceInput; if (error != nil) { println("没有摄像头\(error?.localizedDescription)"); return; } // 3. 设置输出(Metadata元数据) var output: AVCaptureMetadataOutput = AVCaptureMetadataOutput(); // 3.1 设置输出的代理 // 说明:使用主线程队列,相应比较同步,使用其他队列,相应不同步,容易让用户产生不好的体验 output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()); // 4. 拍摄会话 var session1: AVCaptureSession = AVCaptureSession(); session1.addInput(input); session1.addOutput(output); // 4.1 设置输出的格式 // 提示:一定要先设置会话的输出为output之后,再指定输出的元数据类型! output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]; // 5. 设置预览图层(用来让用户能够看到扫描情况) var preview: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session1) as AVCaptureVideoPreviewLayer; // 5.1 设置preview图层的属性 preview.videoGravity = AVLayerVideoGravityResizeAspectFill; // 5.2 设置preview图层的大小 preview.frame = self.view.bounds; // 5.3 将图层添加到视图的图层 self.view.layer.insertSublayer(preview, atIndex: 0); self.previewLayer = preview; // 6. 启动会话 session1.startRunning(); self.session = session1; } func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { // 会频繁的扫描,调用代理方法 // 1. 如果扫描完成,停止会话 self.session?.stopRunning(); // 2. 删除预览图层 self.previewLayer?.removeFromSuperlayer(); println(metadataObjects); // 3. 设置界面显示扫描结果 if (metadataObjects.count > 0) { var obj:AVMetadataMachineReadableCodeObject = metadataObjects[0] as AVMetadataMachineReadableCodeObject; // 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展! println("结果如下:" + obj.stringValue); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。