蘋果公司升級到IOS7後自己的PassBook內建二維碼掃描功能,所以現在使用二維碼功能不需要在藉助第三方庫了
使用前請先匯入AVFoundation.frameWork
// YHQViewController.m
// ReadQRCode
//
// Created by apple on 13-12-22.
// Copyright (c) 2013年 apple. All rights reserved.
//
#import "YHQViewController.h"
#import <AVFoundation/AVFoundation.h>
@interfaceYHQViewController ()<AVCaptureMetadataOutputObjectsDelegate>
// IBOutletUILabel *captureLabe是自己建立的storyBoard中的Label用於顯示擷取到的二維碼的資訊的連線
@end
@implementation YHQViewController
- (void)viewDidLoad
{
[superviewDidLoad];
#pragma mark - 讀取二維碼
- (void)readQRcode
{
// 1. 網路攝影機裝置
AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
// 2. 設定輸入
// 因為模擬器是沒有網路攝影機的,因此在此最好做一個判斷
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:device error:&error];
NSLog(@"沒有網路攝影機-%@", error.localizedDescription);
}
// 3. 設定輸出(Metadata中繼資料)
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc] init];
// 3.1 設定輸出的代理
// 說明:使用主線程隊列,相應比較同步,使用其他隊列,相應不同步,容易讓使用者產生不好的體驗
[output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];
// [output setMetadataObjectsDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
// 4. 拍攝會話
AVCaptureSession *session = [[AVCaptureSessionalloc] init];
// 添加session的輸入和輸出
[session addInput:input];
[session addOutput:output];
// 4.1 設定輸出的格式
// 提示:一定要先設定會話的輸出為output之後,再指定輸出的中繼資料類型!
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 5. 設定預覽圖層(用來讓使用者能夠看到掃描情況)
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayerlayerWithSession:session];
// 5.1 設定preview圖層的屬性
[preview setVideoGravity:AVLayerVideoGravityResizeAspectFill];
// 5.2 設定preview圖層的大小
[preview setFrame:self.view.bounds];
// 5.3 將圖層添加到視圖的圖層
[self.view.layerinsertSublayer:preview atIndex:0];
self.previewLayer = preview;
// 6. 啟動會話
[session startRunning];
self.session = session;
}
#pragma mark - 輸出代理方法
// 此方法是在識別到QRCode,並且完成轉換
// 如果QRCode的內容越大,轉換需要的時間就越長
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
// 會頻繁的掃描,調用代理方法
// 1. 如果掃描完成,停止會話
[self.sessionstopRunning];
// 2. 刪除預覽圖層
[self.previewLayerremoveFromSuperlayer];
NSLog(@"%@", metadataObjects);
// 3. 設定介面顯示掃描結果
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
// 提示:如果需要對url或者名片等資訊進行掃描,可以在此進行擴充!
_captureLabel.text = obj.stringValue;
}
}
// 在storyBoard中添加的按鈕的連線的點擊事件,一點擊按鈕就提示使用者開啟網路攝影機並掃描
- (IBAction)capture {
//掃描二維碼
[selfreadQRcode];
}
@end