二维码---扫描 swift
发布时间:2020-12-14 06:36:00 所属栏目:百科 来源:网络整理
导读:swift 3.0 Xcode 8.1 需要在info.plist 添加 Privacy - Camera Usage Description YES import UIKitimport AVFoundation class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate { var session: AVCaptureSession! //输入输出的中
swift 3.0 Xcode 8.1需要在info.plist 添加 Privacy - Camera Usage Description YESimport UIKit import AVFoundation class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate { var session: AVCaptureSession! //输入输出的中间桥梁 var myInput: AVCaptureDeviceInput! //创建输入流 var myOutput: AVCaptureMetadataOutput! //创建输出流 var bgView = UIView() var barcodeView = UIView() var timer = Timer() var scanLine = UIImageView() override func viewDidLoad() { super.viewDidLoad() //设置定时器,延迟2秒启动 self.timer = Timer.scheduledTimer(timeInterval: 2,target: self,selector: #selector(moveScannerLayer(_:)),userInfo: nil,repeats: true) //初始化链接对象 self.session = AVCaptureSession.init() //设置高质量采集率 self.session.canSetSessionPreset(AVCaptureSessionPresetHigh) //获取摄像设备 let device: AVCaptureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) //捕捉异常,并处理 do { self.myInput = try AVCaptureDeviceInput.init(device: device) self.myOutput = AVCaptureMetadataOutput.init() self.session.addInput(self.myInput) self.session.addOutput(self.myOutput) } catch { print("error") } //创建预览视图 self.createBackGroundView() //设置扫描范围(横屏) self.myOutput.rectOfInterest = CGRect(x: 0.35,y: 0.2,width: UIScreen.main.bounds.width * 0.6 / UIScreen.main.bounds.height,height: 0.6) //设置扫码支持的编码格式(如下设置条形码和二维码兼容) myOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code] //创建串行队列 let dispatchQueue = DispatchQueue(label: "queue",attributes: []) //设置输出流的代理 self.myOutput.setMetadataObjectsDelegate(self,queue: dispatchQueue) //创建预览图层 let myLayer = AVCaptureVideoPreviewLayer.init(session: self.session) myLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill //设置预览图层的填充方式 myLayer?.frame = self.view.layer.bounds //设置预览图层的frame self.bgView.layer.insertSublayer(myLayer!,at: 0) //将预览图层(摄像头画面)插入到预览视图的最底部 //开始扫描 self.session.startRunning() self.timer.fire() } //扫描结果,代理 func captureOutput(_ captureOutput: AVCaptureOutput!,didOutputMetadataObjects metadataObjects: [Any]!,from connection: AVCaptureConnection!) { if metadataObjects != nil && metadataObjects.count > 0 { //停止扫描 self.session.stopRunning() timer.invalidate() //获取第一个 let metaData = metadataObjects.first as! AVMetadataMachineReadableCodeObject print(metaData.stringValue) DispatchQueue.main.async(execute: { //扫描到之后的操作 //...... print(metaData.stringValue) }) } } //创建预览视图 func createBackGroundView() { self.bgView.frame = UIScreen.main.bounds self.bgView.backgroundColor = UIColor.black self.view.addSubview(self.bgView) //灰色蒙版 let topView = UIView(frame: CGRect(x: 0,y: 0,width: UIScreen.main.bounds.size.width,height: UIScreen.main.bounds.size.height * 0.35)) let leftView = UIView(frame: CGRect(x: 0,y: UIScreen.main.bounds.size.height * 0.35,width: UIScreen.main.bounds.size.width * 0.2,height: UIScreen.main.bounds.size.width * 0.6)) let rightView = UIView(frame: CGRect(x: UIScreen.main.bounds.size.width * 0.8,height: UIScreen.main.bounds.size.width * 0.6)) let bottomView = UIView(frame: CGRect(x: 0,y: UIScreen.main.bounds.size.width * 0.6 + UIScreen.main.bounds.size.height * 0.35,height: UIScreen.main.bounds.size.height * 0.65 - UIScreen.main.bounds.size.width * 0.6)) topView.backgroundColor = UIColor(red: 0,green: 0,blue: 0,alpha: 0.4) bottomView.backgroundColor = UIColor(red: 0,alpha: 0.4) leftView.backgroundColor = UIColor(red: 0,alpha: 0.4) rightView.backgroundColor = UIColor(red: 0,alpha: 0.4) //文字说明 let label = UILabel(frame: CGRect(x: 0,y: 10,height: 21)) label.textAlignment = NSTextAlignment.center label.font = UIFont.systemFont(ofSize: 14) label.textColor = UIColor.white label.text = "将二维码/条形码放入扫描框内,即自动扫描" bottomView.addSubview(label) self.bgView.addSubview(topView) self.bgView.addSubview(bottomView) self.bgView.addSubview(leftView) self.bgView.addSubview(rightView) //屏幕中间扫描区域视图(透明) barcodeView.frame = CGRect(x: UIScreen.main.bounds.size.width * 0.2,width: UIScreen.main.bounds.size.width * 0.6,height: UIScreen.main.bounds.size.width * 0.6) barcodeView.backgroundColor = UIColor.clear barcodeView.layer.borderWidth = 1.0 barcodeView.layer.borderColor = UIColor.white.cgColor self.bgView.addSubview(barcodeView) //扫描线 scanLine.frame = CGRect(x: 0,width: barcodeView.frame.size.width,height: 5) scanLine.image = UIImage(named: "QRCodeScanLine") barcodeView.addSubview(scanLine) } //扫描线滚动 func moveScannerLayer(_ timer : Timer) { self.scanLine.frame = CGRect(x: 0,width: self.barcodeView.frame.size.width,height: 12) UIView.animate(withDuration: 2) { self.scanLine.frame = CGRect(x: self.scanLine.frame.origin.x,y: self.scanLine.frame.origin.y + self.barcodeView.frame.size.height - 10,width: self.scanLine.frame.size.width,height: self.scanLine.frame.size.height) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |