Blame view

Pods/swiftScan/Source/LBXScanViewController.swift 6.62 KB
582f536d   yangbin   common:2022.1.28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  //
  //  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?
  
      // 启动区域识别功能
76bb5f50   daifengyi   fix project confi...
35
      open var isOpenInterestRect = false
582f536d   yangbin   common:2022.1.28
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
      
      //连续扫码
      open var isSupportContinuous = 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.
76bb5f50   daifengyi   fix project confi...
53
  
582f536d   yangbin   common:2022.1.28
54
55
56
          // [self.view addSubview:_qRScanView];
          view.backgroundColor = UIColor.black
          edgesForExtendedLayout = UIRectEdge(rawValue: 0)
582f536d   yangbin   common:2022.1.28
57
58
59
60
61
62
63
64
65
66
67
68
69
      }
  
      open func setNeedCodeImage(needCodeImg: Bool) {
          isNeedCodeImage = needCodeImg
      }
  
      // 设置框内识别
      open func setOpenInterestRect(isOpen: Bool) {
          isOpenInterestRect = isOpen
      }
  
      open override func viewDidAppear(_ animated: Bool) {
          super.viewDidAppear(animated)
76bb5f50   daifengyi   fix project confi...
70
          drawScanView()
582f536d   yangbin   common:2022.1.28
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
          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,
76bb5f50   daifengyi   fix project confi...
89
                                       objType: arrayCodeType!,
582f536d   yangbin   common:2022.1.28
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
                                       isCaptureImg: isNeedCodeImage,
                                       cropRect: cropRect,
                                       success: { [weak self] (arrayResult) -> Void in
                                           guard let strongSelf = self else {
                                               return
                                           }
                                           // 停止扫描动画
                                           strongSelf.qRScanView?.stopScanAnimation()
                                           strongSelf.handleCodeResult(arrayResult: arrayResult)
              })
              
              
          }
          
          scanObj?.supportContinuous = isSupportContinuous;
  
          // 结束相机等待提示
          qRScanView?.deviceStopReadying()
  
          // 开始扫描动画
          qRScanView?.startScanAnimation()
  
          // 相机运行
          scanObj?.start()
      }
      
582f536d   yangbin   common:2022.1.28
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
      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")
          }
          
          if !isSupportContinuous {
              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)
      }
      
  }