minimumFocusDistance
binarybase opened this issue · comments
binarybase commented
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);
}
Jamena McInteer commented
I am getting an error "No visible @interface for 'RNCamera' declares the selector 'getMinFocusDistance'" coming from RNCameraManager.m after making these changes.