title: ios rectOfInterest AVCaptureMetadataOutput ignoring
body: <p>I have some scan restriction issue using AVCaptureMetadataOutput and rectOfInterest. I've successfully drawn a UIImage to make sure the scan area is correct. </p>
  
  <p>However, whatever I do it only works if the scan item is in the absolute center of the screen. <strong>It seems to ignore my rect.</strong></p>
  
  <p>Output sizes</p>
  
  <pre><code>Display size width: 414, height: 736
  Percent size width: 0.724638, height: 0.407609
  Crop search area: {{57, 218}, {300, 300}}
  Crop search converted: {{0.29619565217391297, 0.13768115942028991},         {0.40760869565217395, 0.72463768115942029}}
  </code></pre>
  
  <p>Here's the yellow rect drawn
  <a href="https://i.stack.imgur.com/7gORX.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/7gORX.jpg" alt="enter image description here"></a></p>
  
  <p>And the actual method. Full code can be viewed here <a href="https://github.com/fbacker/react-native-camera/blob/barcode-finder/ios/RCTCameraManager.m" rel="nofollow noreferrer">https://github.com/fbacker/react-native-camera/blob/barcode-finder/ios/RCTCameraManager.m</a></p>
  
  <pre><code>- (void)startSession {
  #if TARGET_IPHONE_SIMULATOR
    return;
  #endif
    dispatch_async(self.sessionQueue, ^{
      if (self.presetCamera == AVCaptureDevicePositionUnspecified) {
        self.presetCamera = AVCaptureDevicePositionBack;
      }
  
      AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
      if ([self.session canAddOutput:stillImageOutput])
      {
        stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
        [self.session addOutput:stillImageOutput];
        self.stillImageOutput = stillImageOutput;
      }
  
      AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
      if ([self.session canAddOutput:movieFileOutput])
      {
        [self.session addOutput:movieFileOutput];
        self.movieFileOutput = movieFileOutput;
      }
  
      AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
      CGRect scanBarcodeArea = CGRectMake(0, 0, 0, 0);
      if ([self.session canAddOutput:metadataOutput]) {
  
          [self.session addOutput:metadataOutput];
          [metadataOutput setMetadataObjectsDelegate:self queue:self.sessionQueue];
          [metadataOutput setMetadataObjectTypes:self.barCodeTypes];
  
          // we only want to scan specified area
          // NOTE; Seems we can only set the actual rect after session started, else it doesn't work
          if (self.barcodeFinderVisible) {
  
            NSNumber *imageWidth = [NSNumber numberWithFloat:self.previewLayer.frame.size.width];
            NSNumber *imageHeight = [NSNumber numberWithFloat:self.previewLayer.frame.size.height];
            double imageUseWidth = [imageWidth doubleValue];
            double imageUseHeight = [imageHeight doubleValue];
            double cropWidth = imageUseWidth * self.barcodeFinderPercentageSizeWidth;
            double cropHeight = imageUseHeight * self.barcodeFinderPercentageSizeHeight;
            double cropX = (imageUseWidth/2)-(cropWidth/2);
            double cropY = (imageUseHeight/2)-(cropHeight/2);
            CGRect scanLimit = CGRectMake(cropX, cropY, cropWidth, cropHeight);
            scanBarcodeArea = [_previewLayer metadataOutputRectOfInterestForRect:scanLimit];
            [metadataOutput setRectOfInterest:scanBarcodeArea];
  
          /* ############################
           DEBUG PURPOSE, get some values and draw yellow rect of actual scanning area
          */
  
            /*
            NSLog(@"Display size width: %@, height: %@", imageWidth, imageHeight);
            NSLog(@"Percent size width: %f, height: %f", self.barcodeFinderPercentageSizeWidth, self.barcodeFinderPercentageSizeHeight);
            NSLog(@"Crop search area: %@", NSStringFromCGRect(scanLimit));
            NSLog(@"Crop search converted: %@", NSStringFromCGRect(scanBarcodeArea));
  
            // PAUSE AND PLAY WILL DRAW YELLOW RECT, IF VALID, might appear auto as well. who knows.
            UIView *scanAreaView = [[UIView alloc] initWithFrame:scanLimit];
            scanAreaView.layer.borderColor = [UIColor yellowColor].CGColor;
            scanAreaView.layer.borderWidth = 4;
            [self.view addSubview:scanAreaView];
            */
          }
      }
      self.metadataOutput = metadataOutput;
  
      __weak RCTCameraManager *weakSelf = self;
      [self setRuntimeErrorHandlingObserver:[NSNotificationCenter.defaultCenter addObserverForName:AVCaptureSessionRuntimeErrorNotification object:self.session queue:nil usingBlock:^(NSNotification *note) {
        RCTCameraManager *strongSelf = weakSelf;
        dispatch_async(strongSelf.sessionQueue, ^{
          // Manually restarting the session since it must have been stopped due to an error.
          [strongSelf.session startRunning];
        });
      }]];
  
      [self.session startRunning];
    });
  }
  </code></pre>