diff --git a/packages/react-native/React/Fabric/Surface/RCTFabricSurface.mm b/packages/react-native/React/Fabric/Surface/RCTFabricSurface.mm index 2a5a3a66346f..47273238ff57 100644 --- a/packages/react-native/React/Fabric/Surface/RCTFabricSurface.mm +++ b/packages/react-native/React/Fabric/Surface/RCTFabricSurface.mm @@ -214,7 +214,8 @@ - (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize viewp if (!isnan(viewportOffset.x) && !isnan(viewportOffset.y)) { layoutContext.viewportOffset = RCTPointFromCGPoint(viewportOffset); } - + layoutContext.viewportSize = layoutConstraints.maximumSize; + _surfaceHandler->constraintLayout(layoutConstraints, layoutContext); } @@ -236,6 +237,8 @@ - (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximu layoutConstraints.minimumSize = RCTSizeFromCGSize(minimumSize); layoutConstraints.maximumSize = RCTSizeFromCGSize(maximumSize); + layoutContext.viewportSize = layoutConstraints.maximumSize; + return RCTCGSizeFromSize(_surfaceHandler->measure(layoutConstraints, layoutContext)); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/SurfaceHandlerBinding.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/SurfaceHandlerBinding.cpp index c0f5df5ccb48..3264f113963d 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/SurfaceHandlerBinding.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/SurfaceHandlerBinding.cpp @@ -60,6 +60,7 @@ void SurfaceHandlerBinding::setLayoutConstraints( context.swapLeftAndRightInRTL = (doLeftAndRightSwapInRTL != 0u); context.pointScaleFactor = pixelDensity; context.viewportOffset = {.x = offsetX, .y = offsetY}; + context.viewportSize = {.width = maxWidth, .height = maxHeight}; context.fontSizeMultiplier = fontScale; surfaceHandler_.constraintLayout(constraints, context); diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h b/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h index 3709f7902e7e..f54f90159d40 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutContext.h @@ -59,6 +59,11 @@ struct LayoutContext { * If React Native takes up entire screen, it will be {0, 0}. */ Point viewportOffset{}; + + /* + * Viewport size is size of the React Native's root view. + */ + Size viewportSize{}; }; inline bool operator==(const LayoutContext &lhs, const LayoutContext &rhs) @@ -68,13 +73,15 @@ inline bool operator==(const LayoutContext &lhs, const LayoutContext &rhs) lhs.affectedNodes, lhs.swapLeftAndRightInRTL, lhs.fontSizeMultiplier, - lhs.viewportOffset) == + lhs.viewportOffset, + lhs.viewportSize) == std::tie( rhs.pointScaleFactor, rhs.affectedNodes, rhs.swapLeftAndRightInRTL, rhs.fontSizeMultiplier, - rhs.viewportOffset); + rhs.viewportOffset, + rhs.viewportSize); } } // namespace facebook::react