Skip to content

Commit fb5a17d

Browse files
committed
fix: VisionCamera fabric bug, deinit camera session on screen unmount
1 parent 7d7823d commit fb5a17d

2 files changed

+73
-33
lines changed

patches/react-native-vision-camera+4.0.0-beta.13.patch renamed to patches/react-native-vision-camera+4.0.0-beta.13+001+rn75-compatibility.patch

+14-33
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ index 0000000..46c2c2c
13351335
+#endif /* RCT_NEW_ARCH_ENABLED */
13361336
diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm
13371337
new file mode 100644
1338-
index 0000000..019be20
1338+
index 0000000..b90427e
13391339
--- /dev/null
13401340
+++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm
13411341
@@ -0,0 +1,377 @@
@@ -1384,7 +1384,7 @@ index 0000000..019be20
13841384
+
13851385
+ //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to.
13861386
+ _view = [[CameraView alloc] init];
1387-
+ _view.delegate = self;
1387+
+ _view.delegate = self;
13881388
+
13891389
+ self.contentView = _view;
13901390
+}
@@ -1397,9 +1397,9 @@ index 0000000..019be20
13971397
+{
13981398
+ const auto &newViewProps = *std::static_pointer_cast<CameraViewProps const>(props);
13991399
+ const auto &oldViewProps = *std::static_pointer_cast<CameraViewProps const>(_props);
1400-
+
1400+
+
14011401
+ NSMutableArray* changedProps = [[NSMutableArray alloc] init];
1402-
+
1402+
+
14031403
+ if(oldViewProps.isActive != newViewProps.isActive){
14041404
+ _view.isActive = newViewProps.isActive;
14051405
+ [changedProps addObject:@"isActive"];
@@ -1496,12 +1496,12 @@ index 0000000..019be20
14961496
+ _view.enableFpsGraph = newViewProps.enableFpsGraph;
14971497
+ [changedProps addObject:@"enableFpsGraph"];
14981498
+ }
1499-
+
1500-
+
1499+
+
1500+
+
15011501
+ if(_view.format == nil){
15021502
+ _view.format =[ [NSMutableDictionary alloc] init];
15031503
+ }
1504-
+
1504+
+
15051505
+
15061506
+ //Checking format props, TODO: find cleaner way to do it
15071507
+ if(oldViewProps.format.supportsDepthCapture != newViewProps.format.supportsDepthCapture){
@@ -1521,7 +1521,7 @@ index 0000000..019be20
15211521
+ [_view.format setValue:newPixelFormats forKey:@"pixelFormats"];
15221522
+ [changedProps addObject:@"format"];
15231523
+ }
1524-
+
1524+
+
15251525
+ if(oldViewProps.format.videoStabilizationModes.size() != newViewProps.format.videoStabilizationModes.size()){
15261526
+ NSMutableArray* newVideoStabilizationModes = [[NSMutableArray alloc] init];
15271527
+ for(int i = 0; i < newViewProps.format.videoStabilizationModes.size(); i++){
@@ -1530,7 +1530,7 @@ index 0000000..019be20
15301530
+ [_view.format setValue:newVideoStabilizationModes forKey:@"videoStabilizationModes"];
15311531
+ [changedProps addObject:@"format"];
15321532
+ }
1533-
+
1533+
+
15341534
+ if(oldViewProps.format.photoHeight != newViewProps.format.photoHeight){
15351535
+ [_view.format setValue:[NSNumber numberWithDouble:newViewProps.format.photoHeight] forKey:@"photoHeight"];
15361536
+ [changedProps addObject:@"format"];
@@ -1578,11 +1578,11 @@ index 0000000..019be20
15781578
+ [_view.format setValue:supportsPhotoHDR forKey:@"supportsPhotoHDR"];
15791579
+ [changedProps addObject:@"format"];
15801580
+ }
1581-
+
1581+
+
15821582
+ if (_view.format.count == 0) {
15831583
+ _view.format = nil;
15841584
+ }
1585-
+
1585+
+
15861586
+ if(_view.codeScannerOptions == nil){
15871587
+ _view.codeScannerOptions =[[NSMutableDictionary alloc] init];
15881588
+ }
@@ -1595,12 +1595,12 @@ index 0000000..019be20
15951595
+ [_view.codeScannerOptions setValue:newCodeTypes forKey:@"codeTypes"];
15961596
+ [changedProps addObject:@"codeScannerOptions"];
15971597
+ }
1598-
+
1598+
+
15991599
+ if(oldViewProps.codeScannerOptions.interval != newViewProps.codeScannerOptions.interval){
16001600
+ [_view.codeScannerOptions setValue:[NSNumber numberWithDouble:newViewProps.codeScannerOptions.interval] forKey:@"interval"];
16011601
+ [changedProps addObject:@"codeScannerOptions"];
16021602
+ }
1603-
+
1603+
+
16041604
+ if(
16051605
+ oldViewProps.codeScannerOptions.regionOfInterest.x != newViewProps.codeScannerOptions.regionOfInterest.x ||
16061606
+ oldViewProps.codeScannerOptions.regionOfInterest.y != newViewProps.codeScannerOptions.regionOfInterest.y ||
@@ -1616,7 +1616,7 @@ index 0000000..019be20
16161616
+ [_view.codeScannerOptions setValue:newRegionOfInterest forKey:@"regionOfInterest"];
16171617
+ [changedProps addObject:@"codeScannerOptions"];
16181618
+ }
1619-
+
1619+
+
16201620
+ if (_view.codeScannerOptions.count == 0) {
16211621
+ _view.codeScannerOptions = nil;
16221622
+ }
@@ -2005,25 +2005,6 @@ index 0000000..e47e42f
20052005
@@ -0,0 +1 @@
20062006
+{"version":3,"file":"CameraViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/specs/CameraViewNativeComponent.ts"],"names":[],"mappings":"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"}
20072007
\ No newline at end of file
2008-
diff --git a/node_modules/react-native-vision-camera/package.json b/node_modules/react-native-vision-camera/package.json
2009-
index 86352fa..7af9577 100644
2010-
--- a/node_modules/react-native-vision-camera/package.json
2011-
+++ b/node_modules/react-native-vision-camera/package.json
2012-
@@ -166,5 +166,13 @@
2013-
]
2014-
]
2015-
},
2016-
- "packageManager": "[email protected]+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
2017-
+ "codegenConfig": {
2018-
+ "name": "RNVisioncameraSpec",
2019-
+ "type": "all",
2020-
+ "jsSrcsDir": "./src/specs",
2021-
+ "android": {
2022-
+ "javaPackageName": "com.mrousavy.camera"
2023-
+ }
2024-
+ },
2025-
+ "packageManager": "[email protected]"
2026-
}
20272008
diff --git a/node_modules/react-native-vision-camera/src/Camera.tsx b/node_modules/react-native-vision-camera/src/Camera.tsx
20282009
index 18733ba..1668322 100644
20292010
--- a/node_modules/react-native-vision-camera/src/Camera.tsx
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
diff --git a/node_modules/react-native-vision-camera/ios/RNCameraView.mm b/node_modules/react-native-vision-camera/ios/RNCameraView.mm
2+
index b90427e..feccc33 100644
3+
--- a/node_modules/react-native-vision-camera/ios/RNCameraView.mm
4+
+++ b/node_modules/react-native-vision-camera/ios/RNCameraView.mm
5+
@@ -34,26 +34,46 @@ + (ComponentDescriptorProvider)componentDescriptorProvider
6+
return concreteComponentDescriptorProvider<CameraViewComponentDescriptor>();
7+
}
8+
9+
+- (void) initCamera {
10+
+ static const auto defaultProps = std::make_shared<const CameraViewProps>();
11+
+ _props = defaultProps;
12+
+
13+
+ //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to.
14+
+ _view = [[CameraView alloc] init];
15+
+ _view.delegate = self;
16+
+
17+
+ self.contentView = _view;
18+
+}
19+
+
20+
- (instancetype)initWithFrame:(CGRect)frame
21+
{
22+
self = [super initWithFrame:frame];
23+
-if (self) {
24+
- static const auto defaultProps = std::make_shared<const CameraViewProps>();
25+
- _props = defaultProps;
26+
+ if (self) {
27+
+ [self initCamera];
28+
+ }
29+
+ return self;
30+
+}
31+
+
32+
33+
- //The remaining part of the initializer is standard Objective-C code to create views and layout them with AutoLayout. Here we can change whatever we want to.
34+
- _view = [[CameraView alloc] init];
35+
- _view.delegate = self;
36+
+- (void) prepareForRecycle {
37+
+ [super prepareForRecycle];
38+
39+
- self.contentView = _view;
40+
+ _view.delegate = nil;
41+
+ _view = nil;
42+
+ self.contentView = nil;
43+
}
44+
45+
-return self;
46+
+- (void) updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics {
47+
+ [super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
48+
}
49+
50+
// why we need this func -> https://reactnative.dev/docs/next/the-new-architecture/pillars-fabric-components#write-the-native-ios-code
51+
- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
52+
{
53+
+ if (_view == nil) {
54+
+ [self initCamera];
55+
+ }
56+
+
57+
const auto &newViewProps = *std::static_pointer_cast<CameraViewProps const>(props);
58+
const auto &oldViewProps = *std::static_pointer_cast<CameraViewProps const>(_props);
59+

0 commit comments

Comments
 (0)