The QR Code Scanner package for Appeto SDK.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

151 行
5.7 KiB

  1. //
  2. // QRView.swift
  3. // flutter_qr
  4. //
  5. // Created by Julius Canute on 21/12/18.
  6. //
  7. import Foundation
  8. import MTBBarcodeScanner
  9. public class QRView:NSObject,FlutterPlatformView {
  10. @IBOutlet var previewView: UIView!
  11. var scanner: MTBBarcodeScanner?
  12. var registrar: FlutterPluginRegistrar
  13. var channel: FlutterMethodChannel
  14. var frame: CGRect
  15. public init(withFrame frame: CGRect, withRegistrar registrar: FlutterPluginRegistrar, withId id: Int64){
  16. self.registrar = registrar
  17. self.frame = frame
  18. previewView = UIView(frame: frame)
  19. channel = FlutterMethodChannel(name: "net.touchcapture.qr.flutterqr/qrview_\(id)", binaryMessenger: registrar.messenger())
  20. }
  21. func isCameraAvailable(success: Bool) -> Void {
  22. if success {
  23. do {
  24. try scanner?.startScanning(resultBlock: { [weak self] codes in
  25. if let codes = codes {
  26. for code in codes {
  27. var typeString: String;
  28. switch(code.type) {
  29. case AVMetadataObject.ObjectType.aztec:
  30. typeString = "AZTEC"
  31. case AVMetadataObject.ObjectType.code39:
  32. typeString = "CODE_39"
  33. case AVMetadataObject.ObjectType.code93:
  34. typeString = "CODE_93"
  35. case AVMetadataObject.ObjectType.code128:
  36. typeString = "CODE_128"
  37. case AVMetadataObject.ObjectType.dataMatrix:
  38. typeString = "DATA_MATRIX"
  39. case AVMetadataObject.ObjectType.ean8:
  40. typeString = "EAN_8"
  41. case AVMetadataObject.ObjectType.ean13:
  42. typeString = "EAN_13"
  43. case AVMetadataObject.ObjectType.itf14:
  44. typeString = "ITF"
  45. case AVMetadataObject.ObjectType.pdf417:
  46. typeString = "PDF_417"
  47. case AVMetadataObject.ObjectType.qr:
  48. typeString = "QR_CODE"
  49. case AVMetadataObject.ObjectType.upce:
  50. typeString = "UPC_E"
  51. default:
  52. return
  53. }
  54. guard let stringValue = code.stringValue else { continue }
  55. let result = ["code": stringValue, "type": typeString]
  56. self?.channel.invokeMethod("onRecognizeQR", arguments: result)
  57. }
  58. }
  59. })
  60. } catch {
  61. NSLog("Unable to start scanning")
  62. }
  63. } else {
  64. UIAlertView(title: "Scanning Unavailable", message: "This app does not have permission to access the camera", delegate: nil, cancelButtonTitle: nil, otherButtonTitles: "Ok").show()
  65. }
  66. }
  67. public func view() -> UIView {
  68. channel.setMethodCallHandler({
  69. [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
  70. switch(call.method){
  71. case "setDimensions":
  72. let arguments = call.arguments as! Dictionary<String, Double>
  73. self?.setDimensions(width: arguments["width"] ?? 0, height: arguments["height"] ?? 0, scanArea: arguments["scanArea"] ?? 0)
  74. case "flipCamera":
  75. self?.flipCamera()
  76. case "toggleFlash":
  77. self?.toggleFlash()
  78. case "pauseCamera":
  79. self?.pauseCamera()
  80. case "resumeCamera":
  81. self?.resumeCamera()
  82. default:
  83. result(FlutterMethodNotImplemented)
  84. return
  85. }
  86. })
  87. return previewView
  88. }
  89. func setDimensions(width: Double, height: Double, scanArea: Double) -> Void {
  90. previewView.frame = CGRect(x: 0, y: 0, width: width, height: height)
  91. let midX = self.view().bounds.midX
  92. let midY = self.view().bounds.midY
  93. if let sc: MTBBarcodeScanner = scanner {
  94. if let previewLayer = sc.previewLayer {
  95. previewLayer.frame = previewView.bounds;
  96. }
  97. } else {
  98. scanner = MTBBarcodeScanner(previewView: previewView)
  99. if (scanArea != 0) {
  100. scanner?.didStartScanningBlock = {
  101. self.scanner?.scanRect = CGRect(x: Double(midX) - (scanArea / 2), y: Double(midY) - (scanArea / 2), width: scanArea, height: scanArea)
  102. }
  103. }
  104. MTBBarcodeScanner.requestCameraPermission(success: isCameraAvailable)
  105. }
  106. }
  107. func flipCamera(){
  108. if let sc: MTBBarcodeScanner = scanner {
  109. if sc.hasOppositeCamera() {
  110. sc.flipCamera()
  111. }
  112. }
  113. }
  114. func toggleFlash(){
  115. if let sc: MTBBarcodeScanner = scanner {
  116. if sc.hasTorch() {
  117. sc.toggleTorch()
  118. }
  119. }
  120. }
  121. func pauseCamera() {
  122. if let sc: MTBBarcodeScanner = scanner {
  123. if sc.isScanning() {
  124. sc.freezeCapture()
  125. }
  126. }
  127. }
  128. func resumeCamera() {
  129. if let sc: MTBBarcodeScanner = scanner {
  130. if !sc.isScanning() {
  131. sc.unfreezeCapture()
  132. }
  133. }
  134. }
  135. }