LBXScanViewController.swift
8.14 KB
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
//
// 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 = true
//连续扫码
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.
// [self.view addSubview:_qRScanView];
view.backgroundColor = UIColor.black
edgesForExtendedLayout = UIRectEdge(rawValue: 0)
view.layoutIfNeeded()
}
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.1)
}
open override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(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: defaultMetaDataObjectTypes(),
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()
}
//MARK: ------获取系统默认支持的码的类型
func defaultMetaDataObjectTypes() ->[AVMetadataObject.ObjectType]
{
var types =
[AVMetadataObject.ObjectType.qr,
AVMetadataObject.ObjectType.upce,
AVMetadataObject.ObjectType.code39,
AVMetadataObject.ObjectType.code39Mod43,
AVMetadataObject.ObjectType.ean13,
AVMetadataObject.ObjectType.ean8,
AVMetadataObject.ObjectType.code93,
AVMetadataObject.ObjectType.code128,
AVMetadataObject.ObjectType.pdf417,
AVMetadataObject.ObjectType.aztec,
];
//if #available(iOS 8.0, *)
// if #available(iOS 13.0, *) {
// types.append(AVMetadataObject.ObjectType.salientObject)
// }
types.append(AVMetadataObject.ObjectType.interleaved2of5)
types.append(AVMetadataObject.ObjectType.itf14)
types.append(AVMetadataObject.ObjectType.dataMatrix)
// types.append(AVMetadataObject.ObjectType.interleaved2of5)
// types.append(AVMetadataObject.ObjectType.itf14)
// types.append(AVMetadataObject.ObjectType.dataMatrix)
return types as [AVMetadataObject.ObjectType];
}
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)
}
}