diff --git a/apps/src/tests/Test3345.tsx b/apps/src/tests/Test3345.tsx
new file mode 100644
index 0000000000..6ca0de92da
--- /dev/null
+++ b/apps/src/tests/Test3345.tsx
@@ -0,0 +1,72 @@
+import React from 'react';
+import { View, Button, ScrollView } from 'react-native';
+import { NavigationContainer } from '@react-navigation/native';
+import { createNativeStackNavigator } from '@react-navigation/native-stack';
+
+const Stack = createNativeStackNavigator();
+
+function HomeScreen({ navigation }) {
+ return (
+ // In original repro SafeAreaView from `react-native` has been used here.
+
+
+ );
+}
+
+function ModalScreen() {
+ const onLayout = (event) => {
+ const { width } = event.nativeEvent.layout;
+ console.log('Modal width:', width);
+ };
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+function ModalScreen2() {
+ const onLayout = (event) => {
+ const { width } = event.nativeEvent.layout;
+ console.log('Modal width:', width);
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+function App() {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default App;
diff --git a/apps/src/tests/index.ts b/apps/src/tests/index.ts
index af7d677e20..ec8a48b634 100644
--- a/apps/src/tests/index.ts
+++ b/apps/src/tests/index.ts
@@ -168,3 +168,4 @@ export { default as TestBottomTabs } from './TestBottomTabs';
export { default as TestScreenStack } from './TestScreenStack';
export { default as TestSplitView } from './TestSplitView';
export { default as TestSafeAreaViewIOS } from './TestSafeAreaViewIOS';
+export { default as Test3345 } from './Test3345';
diff --git a/ios/RNSScreen.mm b/ios/RNSScreen.mm
index 65c18f1ddc..bd1fa9429a 100644
--- a/ios/RNSScreen.mm
+++ b/ios/RNSScreen.mm
@@ -1464,6 +1464,14 @@ - (void)updateLayoutMetrics:(const react::LayoutMetrics &)layoutMetrics
_newLayoutMetrics = layoutMetrics;
_oldLayoutMetrics = oldLayoutMetrics;
UIViewController *parentVC = self.reactViewController.parentViewController;
+
+ if (parentVC == nil && [self isKindOfClass:RNSModalScreen.class]) {
+ // If we're in modal presentation, we don't want to set the frame from RN,
+ // as the available space is most likely restriced & differs from what Yoga
+ // resolves during firt layout. We want to rely on native layout here.
+ return;
+ }
+
if (parentVC == nil || ![parentVC isKindOfClass:[RNSNavigationController class]]) {
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
}