Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.98 KB | None | 0 0
  1. // ViewController.swift
  2. // PattyScanner
  3. // Created by PattysiChip on 2019/2/20.
  4. // Copyright © 2019 PattysiChip. All rights reserved.
  5.  
  6. import UIKit
  7. import AVFoundation
  8. import CoreGraphics
  9. // AVCaptutureMetadataOutput 是 Read barcode 的核心,能夠 intercept 攔截來自輸入裝置的原資料。
  10. // 此協定能讓元資料被擷取時,將其轉給代理 self 操作。
  11. class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
  12.  
  13. // ? 可為 nil, ! 不可為 nil
  14. var captureSession: AVCaptureSession? //AVcaptureSession 用來協調自影像輸入裝置至輸出的資料流程
  15. var videoPreviewLayer: AVCaptureVideoPreviewLayer?
  16. var qrCodeFrameView: UIView?
  17. // AVCaptureDevice 代表一個擷取裝置,能藉由其方法控制手機底層屬性。
  18.  
  19. override func viewDidLoad() {
  20.  
  21. let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) // 取得影像中的截圖實體
  22.  
  23. var error: NSError?
  24. let input: AnyObject! = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) // 繼承 &error? /////////
  25. if(error != nil) {
  26.  
  27. print("\(String(describing: error?.localizedDescription))")
  28. /////////BUG
  29. // 錯誤產生,則紀錄狀態,並且返回
  30. return
  31.  
  32. }
  33.  
  34. // 為何此容器沒有設定為變數或是常數???
  35. captureSession = AVCaptureSession() // AVcaptureSession 用來協調自影像輸入裝置至輸出的資料流程
  36. captureSession?.addInput(input as! AVCaptureInput) // 設定輸入裝置, as||as!
  37.  
  38. //AVCaptutureMetadataOutput 是 Read barcode 的核心,能夠 intercept 攔截來自輸入裝置的原資料。
  39. let captureMetadataOutput = AVCaptureMetadataOutput()
  40. captureSession?.addOutput(captureMetadataOutput)
  41.  
  42. // 參數1 直接不繼承,改採 self; 參數2 佇列使用串列佇列,採用如下函數來指定調度佇列代替類別 DispatchQueue,取得預設得串列佇列。
  43. var dispatchQ: DispatchQueue = 00000000
  44. // 常樹和變數,我暫時定為變數,預設為數子八個零 ////////BUG
  45.  
  46. captureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatchQ)
  47. captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
  48.  
  49. //藉由初始化,做出預覽層,
  50. //並藉由方法 addSubLayer 加入 AVCaptureVideoPreviewLayer 型別的值作為 view 視圖層的子層
  51. let defautMetaData = AVCaptureSession()
  52. videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession ?? defautMetaData);
  53. videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
  54. videoPreviewLayer?.frame = view.layer.bounds
  55. view.layer.addSublayer(videoPreviewLayer ?? defautMetaData as! CALayer)
  56. //////////
  57.  
  58. //擷取影像,用以捕捉影像,然而還沒將訊息標籤做出來喔
  59. var messageLabel: UILabel // to get member of "text", change type from UIView to UILabel
  60. captureSession?.startRunning()
  61. view.bringSubviewToFront(messageLabel)
  62.  
  63. //提取元資料,此方法能解碼
  64. func captureOutput(_captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
  65.  
  66. if metadataObjects == nil || metadataObjects.count == 0 {
  67.  
  68. qrCodeFrameView?.frame:CoreGraphics.CGRect
  69. // 要追加 init 框框嗎? //////////// BUG
  70.  
  71. messageLabel.text = "No QR code is detected."
  72.  
  73. return
  74.  
  75. }
  76.  
  77. //取出元資料
  78. // meatadataObj 適合用變數還是常數?
  79. var metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
  80. if metadataObj.type == AVMetadataObject.ObjectType.qr {
  81.  
  82. //偵測二維碼的邊界
  83. let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj as AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject
  84.  
  85. //設定綠色框框的大小,並且確保陣列型態的元資料不為空值,倘若為空值,則最好重置 qrCodeFrameView 可為零
  86. //配合 messageLabel 為預設訊息。
  87. qrCodeFrameView?.frame = barCodeObject.bounds;
  88. if metadataObj.stringValue != nil {
  89.  
  90. messageLabel.text = metadataObj.stringValue
  91.  
  92. }
  93.  
  94. }
  95.  
  96. }
  97.  
  98.  
  99. qrCodeFrameView?.frame = barCodeObject.bounds
  100. ///////////BUG
  101.  
  102. super.viewDidLoad()
  103. // Do any additional setup after loading the view, typically from a nib.
  104. }
  105.  
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement