diff --git a/packages/react-native/React/Base/RCTUtils.mm b/packages/react-native/React/Base/RCTUtils.mm index 4a0e1ca40b6b..0b57f971db8f 100644 --- a/packages/react-native/React/Base/RCTUtils.mm +++ b/packages/react-native/React/Base/RCTUtils.mm @@ -7,6 +7,7 @@ #import "RCTUtils.h" +#import #import #import #import @@ -383,24 +384,26 @@ UIDeviceOrientation RCTDeviceOrientation(void) CGSize RCTScreenSize(void) { - static CGSize portraitSize; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ + static std::atomic cachedSize; + __block CGSize size = cachedSize.load(std::memory_order_relaxed); + + if (CGSizeEqualToSize(size, CGSizeZero)) { RCTUnsafeExecuteOnMainQueueSync(^{ CGSize screenSize = [UIScreen mainScreen].bounds.size; - portraitSize = CGSizeMake(MIN(screenSize.width, screenSize.height), MAX(screenSize.width, screenSize.height)); + size = CGSizeMake(MIN(screenSize.width, screenSize.height), MAX(screenSize.width, screenSize.height)); + cachedSize.store(size, std::memory_order_relaxed); }); - }); + } #if !TARGET_OS_TV if (UIDeviceOrientationIsLandscape(RCTDeviceOrientation())) { - return CGSizeMake(portraitSize.height, portraitSize.width); + return CGSizeMake(size.height, size.width); } else { - return CGSizeMake(portraitSize.width, portraitSize.height); + return CGSizeMake(size.width, size.height); } #else // tvOS doesn't have device orientation, always return landscape size - return CGSizeMake(portraitSize.height, portraitSize.width); + return CGSizeMake(size.height, size.width); #endif } diff --git a/packages/react-native/React/CoreModules/RCTAlertController.mm b/packages/react-native/React/CoreModules/RCTAlertController.mm index b275ebc5c67e..e8b13f071798 100644 --- a/packages/react-native/React/CoreModules/RCTAlertController.mm +++ b/packages/react-native/React/CoreModules/RCTAlertController.mm @@ -23,6 +23,7 @@ - (UIWindow *)alertWindow UIWindowScene *scene = RCTKeyWindow().windowScene; if (scene != nil) { _alertWindow = [[UIWindow alloc] initWithWindowScene:scene]; + _alertWindow.frame = scene.coordinateSpace.bounds; } else { _alertWindow = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; }