LBXScanViewController.swift 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //
  2. // LBXScanViewController.swift
  3. // swiftScan
  4. //
  5. // Created by lbxia on 15/12/8.
  6. // Copyright © 2015年 xialibing. All rights reserved.
  7. //
  8. import UIKit
  9. import Foundation
  10. import AVFoundation
  11. public protocol LBXScanViewControllerDelegate: class {
  12. func scanFinished(scanResult: LBXScanResult, error: String?)
  13. }
  14. public protocol QRRectDelegate {
  15. func drawwed()
  16. }
  17. open class LBXScanViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  18. //返回扫码结果,也可以通过继承本控制器,改写该handleCodeResult方法即可
  19. open weak var scanResultDelegate: LBXScanViewControllerDelegate?
  20. open var delegate: QRRectDelegate?
  21. open var scanObj: LBXScanWrapper?
  22. open var scanStyle: LBXScanViewStyle? = LBXScanViewStyle()
  23. open var qRScanView: LBXScanView?
  24. //启动区域识别功能
  25. open var isOpenInterestRect = false
  26. //识别码的类型
  27. public var arrayCodeType:[AVMetadataObject.ObjectType]?
  28. //是否需要识别后的当前图像
  29. public var isNeedCodeImage = false
  30. //相机启动提示文字
  31. public var readyString:String! = "loading"
  32. override open func viewDidLoad() {
  33. super.viewDidLoad()
  34. // Do any additional setup after loading the view.
  35. // [self.view addSubview:_qRScanView];
  36. print("viewDidLoad...........")
  37. self.view.backgroundColor = UIColor.black
  38. self.edgesForExtendedLayout = UIRectEdge(rawValue: 0)
  39. print("viewDidLoad......end.....")
  40. drawScanView()
  41. perform(#selector(LBXScanViewController.startScan), with: nil, afterDelay: 0.3)
  42. }
  43. open func setNeedCodeImage(needCodeImg:Bool)
  44. {
  45. isNeedCodeImage = needCodeImg;
  46. }
  47. //设置框内识别
  48. open func setOpenInterestRect(isOpen:Bool){
  49. isOpenInterestRect = isOpen
  50. }
  51. override open func viewWillAppear(_ animated: Bool) {
  52. super.viewWillAppear(animated)
  53. print("viewWillAppear...........")
  54. }
  55. override open func viewDidAppear(_ animated: Bool) {
  56. super.viewDidAppear(animated)
  57. print("viewDidAppear...........")
  58. }
  59. @objc open func startScan()
  60. {
  61. print("startScan. .................")
  62. if (scanObj == nil)
  63. {
  64. print("scanObj oooo..................")
  65. var cropRect = CGRect.zero
  66. if isOpenInterestRect
  67. {
  68. cropRect = LBXScanView.getScanRectWithPreView(preView: self.view, style:scanStyle! )
  69. }
  70. //指定识别几种码
  71. if arrayCodeType == nil
  72. {
  73. arrayCodeType = [AVMetadataObject.ObjectType.qr as NSString ,AVMetadataObject.ObjectType.ean13 as NSString ,AVMetadataObject.ObjectType.code128 as NSString] as [AVMetadataObject.ObjectType]
  74. }
  75. scanObj = LBXScanWrapper(videoPreView: self.view,objType:arrayCodeType!, isCaptureImg: isNeedCodeImage,cropRect:cropRect, success: { [weak self] (arrayResult) -> Void in
  76. if let strongSelf = self
  77. {
  78. //停止扫描动画
  79. strongSelf.qRScanView?.stopScanAnimation()
  80. strongSelf.handleCodeResult(arrayResult: arrayResult)
  81. }
  82. })
  83. }
  84. //结束相机等待提示
  85. qRScanView?.deviceStopReadying()
  86. print("qRScanView deviceStopReadying..................")
  87. //开始扫描动画
  88. qRScanView?.startScanAnimation()
  89. print("qRScanView startScanAnimation..................")
  90. //相机运行
  91. scanObj?.start()
  92. print("scanObj start..................")
  93. }
  94. open func drawScanView()
  95. {
  96. if qRScanView == nil
  97. {
  98. print("drawScanView..................")
  99. qRScanView = LBXScanView(frame: self.view.frame,vstyle:scanStyle! )
  100. self.view.addSubview(qRScanView!)
  101. delegate?.drawwed()
  102. }
  103. qRScanView?.deviceStartReadying(readyStr: readyString)
  104. }
  105. /**
  106. 处理扫码结果,如果是继承本控制器的,可以重写该方法,作出相应地处理,或者设置delegate作出相应处理
  107. */
  108. open func handleCodeResult(arrayResult:[LBXScanResult])
  109. {
  110. if let delegate = scanResultDelegate {
  111. self.navigationController? .popViewController(animated: true)
  112. let result:LBXScanResult = arrayResult[0]
  113. delegate.scanFinished(scanResult: result, error: nil)
  114. }else{
  115. for result:LBXScanResult in arrayResult
  116. {
  117. print("%@",result.strScanned ?? "")
  118. }
  119. let result:LBXScanResult = arrayResult[0]
  120. showMsg(title: result.strBarCodeType, message: result.strScanned)
  121. }
  122. }
  123. override open func viewWillDisappear(_ animated: Bool) {
  124. NSObject.cancelPreviousPerformRequests(withTarget: self)
  125. qRScanView?.stopScanAnimation()
  126. scanObj?.stop()
  127. }
  128. open func openPhotoAlbum()
  129. {
  130. LBXPermissions.authorizePhotoWith { [weak self] (granted) in
  131. let picker = UIImagePickerController()
  132. picker.sourceType = UIImagePickerController.SourceType.photoLibrary
  133. picker.delegate = self;
  134. picker.allowsEditing = true
  135. self?.present(picker, animated: true, completion: nil)
  136. }
  137. }
  138. //MARK: -----相册选择图片识别二维码 (条形码没有找到系统方法)
  139. public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
  140. picker.dismiss(animated: true, completion: nil)
  141. var image:UIImage? = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
  142. if (image == nil )
  143. {
  144. image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
  145. }
  146. if(image != nil)
  147. {
  148. let arrayResult = LBXScanWrapper.recognizeQRImage(image: image!)
  149. if arrayResult.count > 0
  150. {
  151. handleCodeResult(arrayResult: arrayResult)
  152. return
  153. }
  154. }
  155. showMsg(title: nil, message: NSLocalizedString("Identify failed", comment: "Identify failed"))
  156. }
  157. func showMsg(title:String?,message:String?)
  158. {
  159. let alertController = UIAlertController(title: nil, message:message, preferredStyle: UIAlertController.Style.alert)
  160. let alertAction = UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), style: UIAlertAction.Style.default) { (alertAction) in
  161. // if let strongSelf = self
  162. // {
  163. // strongSelf.startScan()
  164. // }
  165. }
  166. alertController.addAction(alertAction)
  167. present(alertController, animated: true, completion: nil)
  168. }
  169. deinit
  170. {
  171. // print("LBXScanViewController deinit")
  172. }
  173. }