首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

iOS 7 原生二維碼掃描:AVFoundation 完整實作教學

     編輯:關於C語言

背景

iOS 7 前需依賴 ZBar/ZXing 第三方庫。iOS 7 引入 AVFoundation 原生支援,效能與靈敏度最優。

核心步驟(10 步)

  1. 取得輸入裝置 AVCaptureDevice
  2. 建立輸入 AVCaptureDeviceInput
  3. 建立輸出 AVCaptureMetadataOutput
  4. 設定代理與佇列 setMetadataObjectsDelegate:queue:
  5. 建立 Session AVCaptureSession
  6. 將輸入/輸出加入 Session
  7. 指定元資料類型 AVMetadataObjectTypeQRCode
  8. 建立預覽圖層 AVCaptureVideoPreviewLayer
  9. 設定掃描區域 rectOfInterest(正規化座標 0~1)
  10. 啟動 startRunning

關鍵程式碼片段

// 1-3
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error];
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

// 4
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

// 5-6
AVCaptureSession *session = [[AVCaptureSession alloc] init];
[session addInput:input];
[session addOutput:output];

// 7
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

// 8
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];
preview.frame = self.view.bounds;
[self.view.layer insertSublayer:preview atIndex:0];

// 9
output.rectOfInterest = CGRectMake(0.2, 0.18, 0.6, 0.5);  // x對應垂直、y對應水平

// 10
[session startRunning];

掃描結果處理

- (void)captureOutput:(AVCaptureOutput *)output
didOutputMetadataObjects:(NSArray *)metadataObjects
       fromConnection:(AVCaptureConnection *)connection {
    if (metadataObjects.count > 0) {
        [session stopRunning];
        AVMetadataMachineReadableCodeObject *obj = metadataObjects.lastObject;
        self.resultString = obj.stringValue;
        // 回調 delegate 或跳轉
    }
}

rectOfInterest 坐標系陷阱

  • 座標為正規化比例(0~1)。
  • x 對應垂直方向(上下),y 對應水平方向(左右),與 UIKit 座標系相反。
  • 寬高同理。

完整掃描控制器原始碼

文中提供完整 ScanQrcodeVController 實作,含掃描線動畫、生命週期管理、Delegate 回傳結果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved