AVFoundation可以识别一维条码和二维码
一维条码支持的类型有:UPC-E EAN-8 EAN-13 Code 39 Code 93 Code 128 交错式2of5码(iOS8以上) ITF (iOS8以上);
二维码支持的类型有: QR Axtec PDF-417 Data matrix(iOS8以上)
同样使用AVCaptureMetadataOutput ,和实现AVCaptureMetadataOutputObjectsDelegate代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   |  - (BOOL)setupSessionOutputs:(NSError **)error {     self.metadataOutput = [[AVCaptureMetadataOutput alloc] init];
      if ([self.captureSession canAddOutput:self.metadataOutput]) {         [self.captureSession addOutput:self.metadataOutput];
          dispatch_queue_t mainQueue = dispatch_get_main_queue();         [self.metadataOutput setMetadataObjectsDelegate:self                                                   queue:mainQueue];                  NSArray *types = @[AVMetadataObjectTypeQRCode,                                                  AVMetadataObjectTypeAztecCode,                            AVMetadataObjectTypeUPCECode];
          self.metadataOutput.metadataObjectTypes = types;
      } else {         NSDictionary *userInfo = @{NSLocalizedDescriptionKey:                                        @"Failed to still image output."};         *error = [NSError errorWithDomain:THCameraErrorDomain                                      code:THCameraErrorFailedToAddOutput                                  userInfo:userInfo];         return NO;     }
      return YES; }
  - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects        fromConnection:(AVCaptureConnection *)connection {                     	 	 	    if (metadataObjects.count>0) {         	        [self.session stopRunning];         	        AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;    		      	        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:metadataObject.stringValue message:@"" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];         	        [alert show]; 	    }
  }
 
  | 
 
rectOfInterest
如果不设置的话,就是AVCaptureVideoPreviewLayer中间区域(测试之后就是preview中间的横线)
设置rectOfInterest
1 2 3
   | CGSize size = self.view.bounds.size; CGRect cropRect = scanBg.frame; self.output.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,cropRect.origin.x/size.width,cropRect.size.height/size.height,cropRect.size.width/size.width);
   | 
 
捕捉设备坐标系相对于屏幕坐标系旋转90°。即 右上角为(0,0)左下角为(1,1)。
rectOfInterest 与 sessionPreset
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | CGSize size = self.view.bounds.size; CGRect cropRect = CGRectMake(40, 100, 240, 240); CGFloat p1 = size.height/size.width; CGFloat p2 = 1920./1080.;   if (p1 < p2) {   CGFloat fixHeight = bounds.size.width * 1920. / 1080.;   CGFloat fixPadding = (fixHeight - size.height)/2;   captureOutput.rectOfInterest = CGRectMake((cropRect.origin.y + fixPadding)/fixHeight,                                               cropRect.origin.x/size.width,                                               cropRect.size.height/fixHeight,                                               cropRect.size.width/size.width); } else {     CGFloat fixWidth = bounds.size.height * 1080. / 1920.;     CGFloat fixPadding = (fixWidth - size.width)/2;     captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,                                               (cropRect.origin.x + fixPadding)/fixWidth,                                               cropRect.size.height/size.height,                                               cropRect.size.width/fixWidth); }
   | 
 
试了支付宝的扫描,发现几乎整个屏幕都是扫描灵敏区域。。不知道它是不是也用AVFoundation实现的。。