iOS中二維碼,條形碼等的掃描

二維碼掃描用到的類

(1)AVCaptureDevice輸入的設備
(2)AVCaptureInput輸入流
(3)AVCaptureMetadataOutput輸出流
(4)AVCaptureSession,是個管理工具,管理輸入輸出流AVCaptureInput,AVCaptureMetadataOutput,執行輸入設備和輸出設備之間的數據傳遞
(5)AVCaptureVideopreviewLayer 鏡頭捕捉到的預覽圖層

這些類的使用:
(1)設備AVCaptureDevice *device = [AVCapture defaultDeviceWithMediaType:AVMediaTypeVideo];
(2)輸入流
NSError *error;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if(!input){
NSLog(@”出錯了%@”,[error localizedDescription]);
}

(3)輸出流
AVCaptureMetadataOutput *output = [AVCaptureMetadataOutput alloc]init];

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

rectOfInterest是用來限制可用掃描區域的,官方文檔上的解釋爲A rectangle of interest for limiting the search area for visual metadata.關於它的值的設置不同於其他的rect值,是想法的比例關係,取值範圍在(0,1)之間
output.rectOfInterest = CGRectMake(掃描的區域的y / 屏幕高度,掃描區域的x/屏幕的寬度,掃描區域的高度/屏幕的高度,掃描區域的寬度/屏幕的寬度);

設置掃碼支持的碼類型
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode,AVMetadataObjectEan8Code,AVMetadataObjectTypeCode128Code]];

(4)創建管理者AVCaptureSession
AVCaptureSession *session = [[AVCaptureSession alloc]init];
if([session canAddInput:input]){
[session addInput:input];
}
if([session canAddOutput:output]]){
[session addOutput:output];
}
[session setSessionPreset:AVCaptureSessionPresetHigh];
(4)輸出對象
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
layer.frame = self.view.layer.bounds;
[self.view.layer insertSublayer:layer atIndex:0];

(5)session開始工作
[session startRunning];

(6)AVCaptureMetadataOutputObjectsDelegate
-(void)captureOutput:(AVCaptureOutput )captureOutput didOutputMetadataObjects:(NSArray )metadataObjects fromConnection:(AVCaptureConnection *)connection{
if(metadataObjects != nil && metadataObjects.count > 0){
AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
NSString *result ;
if([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]){
result = metadataObj.stringValue;
NSLog(@”%@”,result)
}else{
NSLog(@”不是二維碼”);
}
//拿到結果去處理
[self performSelectorOnMainThread:@selector(reportScanResult:) withObject:result waitUntilDone:NO];
}
}

//處理結果
- (void)reportScanResult:(NSString *)result{
[session stopRuning];
session = nil;
……
}
//如果想要一個橫線上下滑動
創建view,定時器改變view的frame的y,記得在viewWillDisappear的時候invalidate定時器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章