swift3进bios_Swift3.0仿支付宝二维码扫描效果

更新时间:2021-06-26    来源:ios    手机版     字体:

【www.bbyears.com--ios】

关键代码

 

 代码如下

import AVFoundation

//获取摄像设备

let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

do{

  //创建输入,输出流

  let input =tryAVCaptureDeviceInput.init(device: device)

  let output = AVCaptureMetadataOutput()

  output.rectOfInterest = CGRect(x: 0.1, y: 0, width: 0.9, height: 1)

  //设置代理,并且在主线程刷新

  output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)

  //初始化链接对象 / 高质量采集率

  session.canSetSessionPreset(AVCaptureSessionPresetHigh)

  session.addInput(input)

  session.addOutput(output)

 

  //先添加输入输出流,后设置支持的扫码所支持的格式,不然报错如下:Terminating  app due to uncaught exception 'NSInvalidArgumentException', reason:  '*** -[AVCaptureMetadataOutput setMetadataObjectTypes:] Unsupported type  found - use -availableMetadataObjectTypes'

  //http://stackoverflow.com/questions/31063846/avcapturemetadataoutput-setmetadataobjecttypes-unsupported-type-found

  //设置扫码支持的编码格式

  output.metadataObjectTypes  =  [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,  AVMetadataObjectTypeCode128Code]

 

  let layer = AVCaptureVideoPreviewLayer(session: session)

  layer?.videoGravity = AVLayerVideoGravityResizeAspectFill

  layer?.frame = view.layer.bounds

  view.layer.insertSublayer(layer!, at: 0)

  //开始捕捉

  session.startRunning()

 

}catchlet error as NSError {

  print("errorInfo\(error.domain)")

}

 

/// 实现代理方法

extension ScanCodeController:AVCaptureMetadataOutputObjectsDelegate {

  func  captureOutput(_ captureOutput: AVCaptureOutput!,  didOutputMetadataObjects metadataObjects: [Any]!, from connection:  AVCaptureConnection!) {

 

    ifmetadataObjects.count > 0 {

      session.stopRunning()

      let object = metadataObjects[0]

      let string: String = (object as AnyObject).stringValue

      iflet url = URL(string: string) {

      ifUIApplication.shared.canOpenURL(url) {

        //去打开地址链接

        _ = self.navigationController?.popViewController(animated:true)

        UIApplication.shared.open(url)

 

      }else{

        //获取非链接结果

        let  alertViewController = UIAlertController(title:"扫描结果", message: (object  as AnyObject).stringValue, preferredStyle: .alert)

        let actionCancel = UIAlertAction(title:"退出", style: .cancel, handler: { (action) in

          _ = self.navigationController?.popViewController(animated:true)

        })

        let actinSure = UIAlertAction(title:"再次扫描", style: .default, handler: { (action) in

          self.session.startRunning()

        })

        alertViewController.addAction(actionCancel)

        alertViewController.addAction(actinSure)

        self.present(alertViewController, animated:true, completion: nil)

      }

      }

    }

  }

}

 

DEMO效果:

下载地址:DEMO

本文来源:http://www.bbyears.com/shoujikaifa/126091.html

热门标签

更多>>

本类排行