
import UIKitimport 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. }} 总结 以上是内存溢出为你收集整理的二维码---扫描 swift全部内容,希望文章能够帮你解决二维码---扫描 swift所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)