diff --git a/React/Fabric/RCTConversions.h b/React/Fabric/RCTConversions.h index 1491a6eb541f0e..5136eef321b87a 100644 --- a/React/Fabric/RCTConversions.h +++ b/React/Fabric/RCTConversions.h @@ -9,6 +9,7 @@ #import #import +#import #import #import #import @@ -166,4 +167,9 @@ inline facebook::react::EdgeInsets RCTEdgeInsetsFromUIEdgeInsets(const UIEdgeIns return {edgeInsets.left, edgeInsets.top, edgeInsets.right, edgeInsets.bottom}; } +inline facebook::react::LayoutDirection RCTLayoutDirection(BOOL isRTL) +{ + return isRTL ? facebook::react::LayoutDirection::RightToLeft : facebook::react::LayoutDirection::LeftToRight; +} + NS_ASSUME_NONNULL_END diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index b7b2ad077900b6..ff2d44a47cc537 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -14,6 +14,7 @@ #import #import #import +#import #import #import #import @@ -137,7 +138,8 @@ - (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize std::shared_lock lock(_schedulerMutex); LayoutContext layoutContext = {.pointScaleFactor = RCTScreenScale()}; LayoutConstraints layoutConstraints = {.minimumSize = RCTSizeFromCGSize(minimumSize), - .maximumSize = RCTSizeFromCGSize(maximumSize)}; + .maximumSize = RCTSizeFromCGSize(maximumSize), + .layoutDirection = RCTLayoutDirection([[RCTI18nUtil sharedInstance] isRTL])}; return [_scheduler measureSurfaceWithLayoutConstraints:layoutConstraints layoutContext:layoutContext surfaceId:surface.rootTag]; @@ -148,7 +150,8 @@ - (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize surfa std::shared_lock lock(_schedulerMutex); LayoutContext layoutContext = {.pointScaleFactor = RCTScreenScale()}; LayoutConstraints layoutConstraints = {.minimumSize = RCTSizeFromCGSize(minimumSize), - .maximumSize = RCTSizeFromCGSize(maximumSize)}; + .maximumSize = RCTSizeFromCGSize(maximumSize), + .layoutDirection = RCTLayoutDirection([[RCTI18nUtil sharedInstance] isRTL])}; [_scheduler constraintSurfaceLayoutWithLayoutConstraints:layoutConstraints layoutContext:layoutContext surfaceId:surface.rootTag]; @@ -258,7 +261,8 @@ - (void)_startSurface:(RCTFabricSurface *)surface LayoutContext layoutContext = {.pointScaleFactor = RCTScreenScale()}; LayoutConstraints layoutConstraints = {.minimumSize = RCTSizeFromCGSize(surface.minimumSize), - .maximumSize = RCTSizeFromCGSize(surface.maximumSize)}; + .maximumSize = RCTSizeFromCGSize(surface.maximumSize), + .layoutDirection = RCTLayoutDirection([[RCTI18nUtil sharedInstance] isRTL])}; [_scheduler startSurfaceWithSurfaceId:surface.rootTag moduleName:surface.moduleName diff --git a/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp b/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp index f637f6f45fd08c..b93503a42edd58 100644 --- a/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp +++ b/ReactCommon/fabric/components/text/paragraph/ParagraphShadowNode.cpp @@ -32,7 +32,10 @@ Content const &ParagraphShadowNode::getContent() const { auto textAttributes = TextAttributes::defaultTextAttributes(); textAttributes.apply(getConcreteProps().textAttributes); - + textAttributes.layoutDirection = + YGNodeLayoutGetDirection(&yogaNode_) == YGDirectionRTL + ? LayoutDirection::RightToLeft + : LayoutDirection::LeftToRight; auto attributedString = AttributedString{}; auto attachments = Attachments{}; buildAttributedString(textAttributes, *this, attributedString, attachments);