国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS 原生實現掃描二維碼和條形碼功能限制掃描區域

2020-07-26 02:52:35
字體:
來源:轉載
供稿:網友

現在蘋果iOS系統已經原生支持了二維碼掃描的功能,使用原生來掃描需要導入AVFoundation。

掃描準備

一、獲取攝像設備:

device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

二、創建輸入流

do {  try input = AVCaptureDeviceInput(device: device)} catch let e as NSError {  print(e.localizedDescription)}

三、創建輸出流

output = AVCaptureMetadataOutput()// 設置代理在主線程中刷新output?.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)

四、初始化連接對象

session = AVCaptureSession()// 高質量采集率session?.canSetSessionPreset(AVCaptureSessionPresetHigh)session?.addOutput(output)session?.addInput(input)

五、設置掃描區域

// 特別注意的地方:有效的掃描區域,定位是以設置的右頂點為原點。屏幕寬所在的那條線為y軸,屏幕高所在的線為x軸let x = ((SCREENHeight - QRCodeWidth - topViewHeight) / 2.0) / SCREENHeightlet y = ((SCREENWidth - QRCodeWidth) / 2.0) / SCREENWidthlet width = QRCodeWidth / SCREENHeightlet height = QRCodeWidth / SCREENWidthoutput?.rectOfInterest = CGRect(x: x, y: y, width: width, height: height)

六、設置掃碼支持的編碼格式(如下設置條形碼和二維碼兼容)

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

七、開始捕獲

preview = AVCaptureVideoPreviewLayer(session: session)preview?.videoGravity = AVLayerVideoGravityResizeAspectFillpreview?.frame = self.view.layer.boundsself.view.layer.insertSublayer(preview!, at: 0)session?.startRunning()

掃描動畫

這里的動畫是仿支付寶的掃描框動畫

我們新建一個方法,專門處理我們的動畫。

fileprivate func scanAnimation() -> CABasicAnimation {   let scanNetAnimation = CABasicAnimation()    // 沿Y軸運動   scanNetAnimation.keyPath = "transform.translation.y"   // 掃描框的高度,注意:這里是實際高度的相反數   scanNetAnimation.byValue = QRCodeWidth    // 動畫的持續時間   scanNetAnimation.duration = 1.5   // 動畫的重復次數   scanNetAnimation.repeatCount = MAXFLOAT   return scanNetAnimation}

使用動畫:

我們在創建界面的時候,掃描框有一個UIImageView,我們需要將我們的動畫添加到這個ImageView上面。

scanImageView?.layer.add(scanAnimation(), forKey: nil)

掃描之后的處理

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {  if metadataObjects.count > 0 {    session?.stopRunning()    let metadataObject = metadataObjects[0] as AnyObject    let stringValue: String = metadataObject.stringValue    let vc = QRCodeResultViewController.instantiate()    vc.resultStr = stringValue    self.navigationController?.pushViewController(vc, animated: true)  }}

點擊掃描結果的處理

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {  let requestURL = request.url  if requestURL?.scheme == "http" || requestURL?.scheme == "https" || requestURL?.scheme == "mailto" && navigationType == .linkClicked {//    UIApplication.shared.open(requestURL!, options: [:], completionHandler: nil)    let svc = SFSafariViewController(url: requestURL!)    self.present(svc, animated: true, completion: nil)  }  return true}

我們可以用

open func open(_ url: URL, options: [String : Any] = [:], completionHandler completion: ((Bool) -> Swift.Void)? = nil)

在Safari中打開連接。不過最好是把事件控制在自己的程序中,在iOS 9 之后,蘋果引入了 SFSafariViewController 這個類,可以用這個類來顯示需要瀏覽的網頁。

let svc = SFSafariViewController(url: requestURL!)self.present(svc, animated: true, completion: nil)

以上所述是小編給大家介紹的iOS 原生實現掃描二維碼和條形碼功能限制掃描區域,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴安盟| 虎林市| 喀喇| 师宗县| 沅江市| 镇安县| 新余市| 卢氏县| 衡南县| 璧山县| 临沭县| 扎鲁特旗| 江孜县| 宜阳县| 宁陵县| 洱源县| 汝阳县| 健康| 浠水县| 内丘县| 巴林右旗| 永春县| 大连市| 长岛县| 汤阴县| 大安市| 临潭县| 当雄县| 甘德县| 蒙自县| 新田县| 泗洪县| 安阳市| 建湖县| 鞍山市| 醴陵市| 莱州市| 汤阴县| 高清| 南部县| 崇州市|