123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- //
- // LBXScanViewController.swift
- // swiftScan
- //
- // Created by lbxia on 15/12/8.
- // Copyright © 2015年 xialibing. All rights reserved.
- //
- import UIKit
- import Foundation
- import AVFoundation
- public protocol LBXScanViewControllerDelegate: class {
- func scanFinished(scanResult: LBXScanResult, error: String?)
- }
- public protocol QRRectDelegate {
- func drawwed()
- }
- open class LBXScanViewController: UIViewController {
-
- // 返回扫码结果,也可以通过继承本控制器,改写该handleCodeResult方法即可
- open weak var scanResultDelegate: LBXScanViewControllerDelegate?
- open var delegate: QRRectDelegate?
- open var scanObj: LBXScanWrapper?
- open var scanStyle: LBXScanViewStyle? = LBXScanViewStyle()
- open var qRScanView: LBXScanView?
- // 启动区域识别功能
- open var isOpenInterestRect = false
- // 识别码的类型
- public var arrayCodeType: [AVMetadataObject.ObjectType]?
- // 是否需要识别后的当前图像
- public var isNeedCodeImage = false
- // 相机启动提示文字
- public var readyString: String! = "loading"
- open override func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view.
- // [self.view addSubview:_qRScanView];
- view.backgroundColor = UIColor.black
- edgesForExtendedLayout = UIRectEdge(rawValue: 0)
- }
- open func setNeedCodeImage(needCodeImg: Bool) {
- isNeedCodeImage = needCodeImg
- }
- // 设置框内识别
- open func setOpenInterestRect(isOpen: Bool) {
- isOpenInterestRect = isOpen
- }
- open override func viewDidAppear(_ animated: Bool) {
- super.viewDidAppear(animated)
- drawScanView()
- perform(#selector(LBXScanViewController.startScan), with: nil, afterDelay: 0.3)
- }
- @objc open func startScan() {
- if scanObj == nil {
- var cropRect = CGRect.zero
- if isOpenInterestRect {
- cropRect = LBXScanView.getScanRectWithPreView(preView: view, style: scanStyle!)
- }
- // 指定识别几种码
- if arrayCodeType == nil {
- arrayCodeType = [AVMetadataObject.ObjectType.qr as NSString,
- AVMetadataObject.ObjectType.ean13 as NSString,
- AVMetadataObject.ObjectType.code128 as NSString] as [AVMetadataObject.ObjectType]
- }
- scanObj = LBXScanWrapper(videoPreView: view,
- objType: arrayCodeType!,
- isCaptureImg: isNeedCodeImage,
- cropRect: cropRect,
- success: { [weak self] (arrayResult) -> Void in
- guard let strongSelf = self else {
- return
- }
- // 停止扫描动画
- strongSelf.qRScanView?.stopScanAnimation()
- strongSelf.handleCodeResult(arrayResult: arrayResult)
- })
- }
- // 结束相机等待提示
- qRScanView?.deviceStopReadying()
- // 开始扫描动画
- qRScanView?.startScanAnimation()
- // 相机运行
- scanObj?.start()
- }
-
- open func drawScanView() {
- if qRScanView == nil {
- qRScanView = LBXScanView(frame: view.frame, vstyle: scanStyle!)
- view.addSubview(qRScanView!)
- delegate?.drawwed()
- }
- qRScanView?.deviceStartReadying(readyStr: readyString)
- }
-
- /**
- 处理扫码结果,如果是继承本控制器的,可以重写该方法,作出相应地处理,或者设置delegate作出相应处理
- */
- open func handleCodeResult(arrayResult: [LBXScanResult]) {
- guard let delegate = scanResultDelegate else {
- fatalError("you must set scanResultDelegate or override this method without super keyword")
- }
- navigationController?.popViewController(animated: true)
- if let result = arrayResult.first {
- delegate.scanFinished(scanResult: result, error: nil)
- } else {
- let result = LBXScanResult(str: nil, img: nil, barCodeType: nil, corner: nil)
- delegate.scanFinished(scanResult: result, error: "no scan result")
- }
- }
-
- open override func viewWillDisappear(_ animated: Bool) {
- NSObject.cancelPreviousPerformRequests(withTarget: self)
- qRScanView?.stopScanAnimation()
- scanObj?.stop()
- }
-
- @objc open func openPhotoAlbum() {
- LBXPermissions.authorizePhotoWith { [weak self] _ in
- let picker = UIImagePickerController()
- picker.sourceType = UIImagePickerController.SourceType.photoLibrary
- picker.delegate = self
- picker.allowsEditing = true
- self?.present(picker, animated: true, completion: nil)
- }
- }
- }
- //MARK: - 图片选择代理方法
- extension LBXScanViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
-
- //MARK: -----相册选择图片识别二维码 (条形码没有找到系统方法)
- public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
- picker.dismiss(animated: true, completion: nil)
-
- let editedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
- let originalImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
- guard let image = editedImage ?? originalImage else {
- showMsg(title: nil, message: NSLocalizedString("Identify failed", comment: "Identify failed"))
- return
- }
- let arrayResult = LBXScanWrapper.recognizeQRImage(image: image)
- if !arrayResult.isEmpty {
- handleCodeResult(arrayResult: arrayResult)
- }
- }
-
- }
- //MARK: - 私有方法
- private extension LBXScanViewController {
-
- func showMsg(title: String?, message: String?) {
- let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)
- let alertAction = UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), style: .default, handler: nil)
- alertController.addAction(alertAction)
- present(alertController, animated: true, completion: nil)
- }
-
- }
|