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

NO IMAGE

現在蘋果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) / SCREENHeight
let y = ((SCREENWidth - QRCodeWidth) / 2.0) / SCREENWidth
let width = QRCodeWidth / SCREENHeight
let height = QRCodeWidth / SCREENWidth
output?.rectOfInterest = CGRect(x: x, y: y, width: width, height: height)

六、設定掃碼支援的編碼格式(如下設定條形碼和二維碼相容)


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

七、開始捕獲


preview = AVCaptureVideoPreviewLayer(session: session)
preview?.videoGravity = AVLayerVideoGravityResizeAspectFill
preview?.frame = self.view.layer.bounds
self.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 原生實現掃描二維碼和條形碼功能限制掃描區域,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對指令碼之家網站的支援!

您可能感興趣的文章:

iOS 條碼及二維碼掃描(從相簿中讀取條形碼/二維碼)及掃碼過程中遇到的坑iOS二維碼的生成和掃描ios swift3.0實現二維碼掃描、生成、識別示例程式碼掃描二維碼控制元件的封裝iOS實現ios原生二維碼掃描IOS筆記061之二維碼的生成和掃描iOS實現二維碼的掃描功能