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

首頁 > 系統(tǒng) > iOS > 正文

iOS 原生實現(xiàn)掃描二維碼和條形碼功能限制掃描區(qū)域

2019-10-21 18:47:31
字體:
供稿:網(wǎng)友

現(xiàn)在蘋果iOS系統(tǒng)已經(jīng)原生支持了二維碼掃描的功能,使用原生來掃描需要導入AVFoundation。

掃描準備

一、獲取攝像設(shè)備:

device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

二、創(chuàng)建輸入流

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

三、創(chuàng)建輸出流

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

四、初始化連接對象

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

五、設(shè)置掃描區(qū)域

// 特別注意的地方:有效的掃描區(qū)域,定位是以設(shè)置的右頂點為原點。屏幕寬所在的那條線為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)

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

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"   // 掃描框的高度,注意:這里是實際高度的相反數(shù)   scanNetAnimation.byValue = QRCodeWidth    // 動畫的持續(xù)時間   scanNetAnimation.duration = 1.5   // 動畫的重復(fù)次數(shù)   scanNetAnimation.repeatCount = MAXFLOAT   return scanNetAnimation}

使用動畫:

我們在創(chuàng)建界面的時候,掃描框有一個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)  }}

點擊掃描結(jié)果的處理

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 這個類,可以用這個類來顯示需要瀏覽的網(wǎng)頁。

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

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


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新巴尔虎左旗| 崇义县| 石门县| 渝北区| 手机| 佛冈县| 广水市| 神池县| 安龙县| 北票市| 嘉祥县| 来凤县| 泸州市| 莱州市| 友谊县| 罗源县| 从江县| 安吉县| 阳城县| 班戈县| 钦州市| 漳州市| 小金县| 山东| 垦利县| 东乌珠穆沁旗| 卢氏县| 龙川县| 扶沟县| 淅川县| 芦溪县| 许昌市| 敦煌市| 正安县| 利川市| 黔东| 洮南市| 镇江市| 上林县| 三江| 达拉特旗|