123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- //
- // 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, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
-
- //返回扫码结果,也可以通过继承本控制器,改写该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"
- override open func viewDidLoad() {
- super.viewDidLoad()
- // Do any additional setup after loading the view.
-
- // [self.view addSubview:_qRScanView];
- self.view.backgroundColor = UIColor.black
- self.edgesForExtendedLayout = UIRectEdge(rawValue: 0)
-
- drawScanView()
-
- perform(#selector(LBXScanViewController.startScan), with: nil, afterDelay: 0.3)
- }
-
- open func setNeedCodeImage(needCodeImg:Bool)
- {
- isNeedCodeImage = needCodeImg;
- }
- //设置框内识别
- open func setOpenInterestRect(isOpen:Bool){
- isOpenInterestRect = isOpen
- }
-
- override open func viewWillAppear(_ animated: Bool) {
- super.viewWillAppear(animated)
- }
-
- override open func viewDidAppear(_ animated: Bool) {
-
- super.viewDidAppear(animated)
-
- }
-
- @objc open func startScan()
- {
- if (scanObj == nil)
- {
- var cropRect = CGRect.zero
- if isOpenInterestRect
- {
- cropRect = LBXScanView.getScanRectWithPreView(preView: self.view, style:scanStyle! )
- }
-
- //指定识别几种码
- if arrayCodeType == nil
- {
- arrayCodeType = [AVMetadataObject.ObjectType.qr as NSString] as [AVMetadataObject.ObjectType]
- }
-
- scanObj = LBXScanWrapper(videoPreView: self.view,objType:arrayCodeType!, isCaptureImg: isNeedCodeImage,cropRect:cropRect, success: { [weak self] (arrayResult) -> Void in
-
- if let strongSelf = self
- {
- //停止扫描动画
- strongSelf.qRScanView?.stopScanAnimation()
-
- strongSelf.handleCodeResult(arrayResult: arrayResult)
- }
- })
- }
-
- //结束相机等待提示
- qRScanView?.deviceStopReadying()
- //开始扫描动画
- qRScanView?.startScanAnimation()
- //相机运行
- scanObj?.start()
- }
-
- open func drawScanView()
- {
- if qRScanView == nil
- {
- qRScanView = LBXScanView(frame: self.view.frame,vstyle:scanStyle! )
- self.view.addSubview(qRScanView!)
- delegate?.drawwed()
- }
- qRScanView?.deviceStartReadying(readyStr: readyString)
-
- }
-
-
- /**
- 处理扫码结果,如果是继承本控制器的,可以重写该方法,作出相应地处理,或者设置delegate作出相应处理
- */
- open func handleCodeResult(arrayResult:[LBXScanResult])
- {
- if let delegate = scanResultDelegate {
-
- self.navigationController? .popViewController(animated: true)
- let result:LBXScanResult = arrayResult[0]
-
- delegate.scanFinished(scanResult: result, error: nil)
- }else{
-
- for result:LBXScanResult in arrayResult
- {
- print("%@",result.strScanned ?? "")
- }
-
- let result:LBXScanResult = arrayResult[0]
-
- showMsg(title: result.strBarCodeType, message: result.strScanned)
- }
- }
-
- override open func viewWillDisappear(_ animated: Bool) {
-
- NSObject.cancelPreviousPerformRequests(withTarget: self)
-
- qRScanView?.stopScanAnimation()
-
- scanObj?.stop()
- }
-
- open func openPhotoAlbum()
- {
- LBXPermissions.authorizePhotoWith { [weak self] (granted) in
-
- let picker = UIImagePickerController()
-
- picker.sourceType = UIImagePickerController.SourceType.photoLibrary
-
- picker.delegate = self;
-
- picker.allowsEditing = true
-
- self?.present(picker, animated: true, completion: nil)
- }
- }
-
- //MARK: -----相册选择图片识别二维码 (条形码没有找到系统方法)
- public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
- picker.dismiss(animated: true, completion: nil)
-
- var image:UIImage? = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
-
- if (image == nil )
- {
- image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
- }
-
- if(image != nil)
- {
- let arrayResult = LBXScanWrapper.recognizeQRImage(image: image!)
- if arrayResult.count > 0
- {
- handleCodeResult(arrayResult: arrayResult)
- return
- }
- }
-
- showMsg(title: nil, message: NSLocalizedString("Identify failed", comment: "Identify failed"))
- }
-
-
-
- func showMsg(title:String?,message:String?)
- {
-
- let alertController = UIAlertController(title: nil, message:message, preferredStyle: UIAlertController.Style.alert)
- let alertAction = UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), style: UIAlertAction.Style.default) { (alertAction) in
-
- // if let strongSelf = self
- // {
- // strongSelf.startScan()
- // }
- }
-
- alertController.addAction(alertAction)
- present(alertController, animated: true, completion: nil)
- }
- deinit
- {
- // print("LBXScanViewController deinit")
- }
- }
|