使用 AVFoundation系統庫來進行二維碼掃描而且限制掃描二維碼的範圍。(由於默認的是全屏掃描)session
-(void)beginCodeide
{性能
//1.攝像頭設備this
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];spa
/*線程
// Media types代理
AVMediaTypeVideorest
AVMediaTypeAudiocode
AVMediaTypeTextorm
AVMediaTypeClosedCaption
AVMediaTypeSubtitle
AVMediaTypeTimecode
AVMediaTypeMetadata
AVMediaTypeMuxed
*/
//2.設置輸入
/**
* 設置輸入 此方法須要判斷 由於模擬器沒有攝像頭
*
* @param 把攝像頭做爲輸入的設備
*
* @return 返回AVCaptureInput
*/
NSError *error = nil;
AVCaptureInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (error) {
NSLog(@"沒有攝像頭%@",error);
return;
}
//3.設置輸出(Metdata元數據)
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
//3.1輸出的代理 捕獲二維碼的圖像
//dispatch_get_main_queue()使用主線程隊列,響應比較同步,使用其餘隊列響應不一樣步。
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//3.2 設置掃描區域 默認是全屏掃描
//這個CGRectMake(Y,X,H,W) 1表明最大值 原點是左上角 爲起始點
// [output setRectOfInterest:CGRectMake(0, 0.5, 0.5, 0.5)];//左上角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0.5, 0.5, 0.5, 0.5)];//左下角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0.5, 0, 0.5, 0.5)]; //右下角 1/4 屏幕
// [output setRectOfInterest:CGRectMake(0, 0, 0.5, 0.5)]; //右上角 1/4 屏幕
// [output setRectOfInterest:CGRectMake((124)/ScreenHigh, ((ScreenWidth220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)]; //設置自定義像素點的 位置
[output setRectOfInterest:CGRectMake(0.25,0.25, 0.5, 0.5)]; //貌似 中間的感受!!!
//4.拍攝會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
_session = session;
//添加session的輸入和輸出
[session addInput:input];
[session addOutput:output];
//4.1設置輸出的格式
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//5.設置預覽圖層 (讓用戶看到掃描結果)
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];
_previewLayer = preview;
//5.1設置preview的屬性
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
//5.2設置preview的圖層的大小
[preview setFrame:self.view.bounds];
//5.3將圖層添加到視圖的圖層
[self.view.layer insertSublayer:preview atIndex:0];
//6.啓動會話
[session startRunning];
}
#pragma mark 輸出的代理方法
//此方法是在識別到QRCode,而且完成轉換
//若是QRCode的內容越大,轉換須要的時間就越長
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
//會頻繁的掃描
//若是掃描完成就中止
[_session stopRunning];
//刪除預覽的圖層
[_previewLayer removeFromSuperlayer];
//設置界面顯示掃描結果
NSString *reslutStr = [[NSString alloc] init];
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
reslutStr = [obj stringValue];//這個就是 掃描的結果
//若是須要對URL 名片 等信息進行掃描 再次進行擴展
}
NSLog(@"%@",metadataObjects);
}
//關於設置掃描區域的解釋
@abstract 摘要
Specifies a rectangle of interest for limiting the search area for visual metadata.
指定一個矩形限制搜索區域的視覺感興趣的元數據。
@discussion 討論
The value of this property is a CGRect that determines the receiver's rectangle of interest for each frame of video.
這個屬性的值是CGRect中決定了接收機的矩形感興趣的視頻的每一幀
The rectangle's origin is top left and is relative to the coordinate space of the device providing the metadata. Specifying
a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the
value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.
矩形的起源是左上角相對於設備的座標空間提供元數據。指定rectOfInterest可能改善檢測性能對於某些類型的元數據。此屬性的默認值價值CGRectMake(0,0,1,1)。元數據對象的邊界不相交的rectOfInterest恕不退還
//CGRectMake(Y,X,H,W) 這個 座標順序很重要