react-native-camera / react-native-camera

A Camera component for React Native. Also supports barcode scanning!

Home Page:https://react-native-camera.github.io/react-native-camera/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

minimumFocusDistance

binarybase opened this issue · comments

I have implemented getMinFocusDistance method on RNCamera's interface. To scan barcodes or QR codes on newest iPhone 14 Pro, you have to use ultra-wide-angle camera. So, then you are able to adjust zoom level using minimum zoom factor as is mentioned in official Apple's example (AVCamBarcode project).

you can extend RNCamera.m with

-(CGFloat) getMinFocusDistance {
    AVCaptureDevice *device = [self.videoCaptureDeviceInput device];
    CGFloat deviceMinimumFocusDistance = device.minimumFocusDistance;
    if(deviceMinimumFocusDistance == -1){
        return 1.0f;
    }

    CGFloat deviceFieldOfView = device.activeFormat.videoFieldOfView;
    CGFloat radians = (deviceFieldOfView / 2) * M_PI / 180;
    CGFloat filledCodeSize = 20 / _rectOfInterest.size.width;
    CGFloat minimumSubjectDistanceForCode = filledCodeSize / tan(radians);

    if(minimumSubjectDistanceForCode < deviceMinimumFocusDistance) {
        CGFloat zoomFactor = deviceMinimumFocusDistance / minimumSubjectDistanceForCode;
        return zoomFactor;
    }

    return 1.0f;
}

RNCameraManager.m

RCT_REMAP_METHOD(getMinFocusDistance, reactTag:(nonnull NSNumber *)reactTag
                  resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject) {
    [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, RNCamera *> *viewRegistry) {
        RNCamera *view = viewRegistry[reactTag];
        if (![view isKindOfClass:[RNCamera class]]) {
            RCTLogError(@"Invalid view returned from registry, expecting RNCamera, got: %@", view);
            resolve(false);
        } else {
           CGFloat zoomFactor = [view getMinFocusDistance];
           resolve(@(zoomFactor));
        }
    }];
}

and javascript
RNCamera.js

async getMinFocusDistance() {
    return CameraManager.getMinFocusDistance(this._cameraHandle);
  }

I am getting an error "No visible @interface for 'RNCamera' declares the selector 'getMinFocusDistance'" coming from RNCameraManager.m after making these changes.