Skip to content

Commit 33b55cc

Browse files
rdonnellyfacebook-github-bot
authored andcommitted
Calculate Correct Window Dimensions for iOS (#19932)
Summary: Fixes: #16152 [iOS] [Fixed] - Pass back correct dimensions for application window in Dimensions module Pull Request resolved: #19932 Reviewed By: cpojer Differential Revision: D14312906 Pulled By: PeteTheHeat fbshipit-source-id: aacb729c89862267465eefc3534c48d9d4b5d746
1 parent 4059034 commit 33b55cc

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

React/Modules/RCTDeviceInfo.m

+44-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
@implementation RCTDeviceInfo {
1717
#if !TARGET_OS_TV
1818
UIInterfaceOrientation _currentInterfaceOrientation;
19+
NSDictionary *_currentInterfaceDimensions;
1920
#endif
2021
}
2122

@@ -48,6 +49,13 @@ - (void)setBridge:(RCTBridge *)bridge
4849
selector:@selector(interfaceOrientationDidChange)
4950
name:UIApplicationDidChangeStatusBarOrientationNotification
5051
object:nil];
52+
53+
_currentInterfaceDimensions = RCTExportedDimensions(_bridge);
54+
55+
[[NSNotificationCenter defaultCenter] addObserver:self
56+
selector:@selector(interfaceFrameDidChange)
57+
name:UIApplicationDidBecomeActiveNotification
58+
object:nil];
5159
#endif
5260
}
5361

@@ -77,16 +85,23 @@ static BOOL RCTIsIPhoneX() {
7785
RCTAssertMainQueue();
7886

7987
RCTDimensions dimensions = RCTGetDimensions(bridge.accessibilityManager.multiplier);
80-
typeof (dimensions.window) window = dimensions.window; // Window and Screen are considered equal for iOS.
81-
NSDictionary<NSString *, NSNumber *> *dims = @{
88+
typeof (dimensions.window) window = dimensions.window;
89+
NSDictionary<NSString *, NSNumber *> *dimsWindow = @{
8290
@"width": @(window.width),
8391
@"height": @(window.height),
8492
@"scale": @(window.scale),
8593
@"fontScale": @(window.fontScale)
8694
};
95+
typeof (dimensions.screen) screen = dimensions.screen;
96+
NSDictionary<NSString *, NSNumber *> *dimsScreen = @{
97+
@"width": @(screen.width),
98+
@"height": @(screen.height),
99+
@"scale": @(screen.scale),
100+
@"fontScale": @(screen.fontScale)
101+
};
87102
return @{
88-
@"window": dims,
89-
@"screen": dims
103+
@"window": dimsWindow,
104+
@"screen": dimsScreen
90105
};
91106
}
92107

@@ -163,6 +178,31 @@ - (void)_interfaceOrientationDidChange
163178
_currentInterfaceOrientation = nextOrientation;
164179
}
165180

181+
182+
- (void)interfaceFrameDidChange
183+
{
184+
__weak typeof(self) weakSelf = self;
185+
RCTExecuteOnMainQueue(^{
186+
[weakSelf _interfaceFrameDidChange];
187+
});
188+
}
189+
190+
191+
- (void)_interfaceFrameDidChange
192+
{
193+
NSDictionary *nextInterfaceDimensions = RCTExportedDimensions(_bridge);
194+
195+
if (!([nextInterfaceDimensions isEqual:_currentInterfaceDimensions])) {
196+
#pragma clang diagnostic push
197+
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
198+
[_bridge.eventDispatcher sendDeviceEventWithName:@"didUpdateDimensions"
199+
body:nextInterfaceDimensions];
200+
#pragma clang diagnostic pop
201+
}
202+
203+
_currentInterfaceDimensions = nextInterfaceDimensions;
204+
}
205+
166206
#endif // TARGET_OS_TV
167207

168208

React/UIUtils/RCTUIUtils.m

+16-3
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,32 @@
77

88
#import "RCTUIUtils.h"
99

10+
#import "RCTUtils.h"
11+
1012
RCTDimensions RCTGetDimensions(CGFloat fontScale)
1113
{
1214
UIScreen *mainScreen = UIScreen.mainScreen;
1315
CGSize screenSize = mainScreen.bounds.size;
16+
17+
UIView *mainWindow;
18+
mainWindow = RCTKeyWindow();
19+
CGSize windowSize = mainWindow.bounds.size;
20+
1421
RCTDimensions result;
15-
typeof (result.window) dims = {
22+
typeof (result.screen) dimsScreen = {
1623
.width = screenSize.width,
1724
.height = screenSize.height,
1825
.scale = mainScreen.scale,
1926
.fontScale = fontScale
2027
};
21-
result.window = dims;
22-
result.screen = dims;
28+
typeof (result.window) dimsWindow = {
29+
.width = windowSize.width,
30+
.height = windowSize.height,
31+
.scale = mainScreen.scale,
32+
.fontScale = fontScale
33+
};
34+
result.screen = dimsScreen;
35+
result.window = dimsWindow;
2336

2437
return result;
2538
}

0 commit comments

Comments
 (0)