@@ -37,15 +37,7 @@ open class SPQRCameraViewController: UIViewController {
3737 // MARK: - Private Static Properties
3838
3939 private static let supportedCodeTypes = [
40- AVMetadataObject . ObjectType. upce,
41- AVMetadataObject . ObjectType. code39,
42- AVMetadataObject . ObjectType. code39Mod43,
43- AVMetadataObject . ObjectType. code93,
44- AVMetadataObject . ObjectType. code128,
45- AVMetadataObject . ObjectType. ean8,
46- AVMetadataObject . ObjectType. ean13,
4740 AVMetadataObject . ObjectType. aztec,
48- AVMetadataObject . ObjectType. pdf417,
4941 AVMetadataObject . ObjectType. qr
5042 ]
5143
@@ -103,14 +95,35 @@ open class SPQRCameraViewController: UIViewController {
10395 videoPreviewLayer. frame = view. layer. bounds
10496 }
10597
106- open func updatePreviewView( for object: AVMetadataMachineReadableCodeObject ) {
107- if let string = object. stringValue {
108- if let url = URL ( string: string) {
109- defaultPreviewView. text = " URL: \" \( url. absoluteString) \" "
110- } else {
111- defaultPreviewView. text = " Text: \" \( string) \" "
98+ open func updateViews( result: SPQRCode ) {
99+ if let updatableFrameView = frameView as? SPQRCodeUpdatable {
100+ updatableFrameView. update ( for: result)
101+ }
102+
103+ if let updatablePreviewView = previewView as? SPQRCodeUpdatable {
104+ updatablePreviewView. update ( for: result)
105+ }
106+ }
107+
108+ open func convert( object: AVMetadataMachineReadableCodeObject ) -> SPQRCode ? {
109+ guard let string = object. stringValue else {
110+ return nil
111+ }
112+
113+ if let components = URLComponents ( string: string) , components. scheme != nil {
114+ if let url = components. url {
115+ return . url( url)
116+ }
117+ }
118+
119+ if let pattern = try ? NSRegularExpression ( pattern: " ^0x[a-fA-F0-9]{40}$ " ) {
120+ let range = NSRange ( location: 0 , length: string. count)
121+ if pattern. firstMatch ( in: string, range: range) != nil {
122+ return . ethWallet( string)
112123 }
113124 }
125+
126+ return . text( string)
114127 }
115128
116129 // MARK: - Actions
@@ -147,12 +160,12 @@ private extension SPQRCameraViewController {
147160 let leadingPreviewConstraint = previewView. leadingAnchor. constraint (
148161 lessThanOrEqualTo: frameView. leadingAnchor
149162 )
150- leadingPreviewConstraint. priority = . defaultHigh
163+ leadingPreviewConstraint. priority = . defaultLow
151164
152165 let trailingPreviewConstraint = previewView. trailingAnchor. constraint (
153166 greaterThanOrEqualTo: frameView. trailingAnchor
154167 )
155- trailingPreviewConstraint. priority = . defaultHigh
168+ trailingPreviewConstraint. priority = . defaultLow
156169
157170 NSLayoutConstraint . activate ( [
158171 centerPreviewConstraint,
@@ -213,17 +226,23 @@ extension SPQRCameraViewController: AVCaptureMetadataOutputObjectsDelegate {
213226 return
214227 }
215228
216- guard let qrString = metadataObj. stringValue else {
229+ guard let result = convert ( object : metadataObj) else {
217230 return
218231 }
219232
220- updatePreviewView ( for : metadataObj )
221- notifyFound ( string : qrString )
233+ updateViews ( result : result )
234+ notifyFound ( result : result )
222235
223236 if frameView. isHidden {
224237 frameView. frame = frame
225238 } else {
226- UIView . animate ( withDuration: 0.3 , delay: 0.0 , options: [ . allowUserInteraction, . beginFromCurrentState] , animations: {
239+ let options : UIView . AnimationOptions = [
240+ . allowUserInteraction,
241+ . beginFromCurrentState,
242+ . curveEaseInOut,
243+ ]
244+
245+ UIView . animate ( withDuration: 0.2 , delay: 0.0 , options: options, animations: {
227246 self . frameView. frame = frame
228247 self . view. layoutIfNeeded ( )
229248 } , completion: nil )
@@ -233,7 +252,7 @@ extension SPQRCameraViewController: AVCaptureMetadataOutputObjectsDelegate {
233252 frameView. isHidden = false
234253
235254 updateTimer? . invalidate ( )
236- updateTimer = Timer ( fire: Date ( timeIntervalSinceNow: 0.5 ) , interval: 2 , repeats: false , block: { _ in
255+ updateTimer = Timer ( fire: Date ( timeIntervalSinceNow: 0.8 ) , interval: 2 , repeats: false , block: { _ in
237256 self . frameView. isHidden = true
238257 self . previewView. isHidden = true
239258 } )
@@ -273,11 +292,11 @@ private extension SPQRCameraViewController {
273292 return videoPreviewLayer
274293 }
275294
276- private func notifyFound( string : String ) {
295+ private func notifyFound( result : SPQRCode ) {
277296 if let delegate = delegate {
278- delegate. camera ( self , didFound: string )
297+ delegate. camera ( self , didFound: result )
279298 } else {
280- cameraFoundHandler ? ( string )
299+ cameraFoundHandler ? ( result )
281300 }
282301 }
283302
0 commit comments