diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index b8894132b77619..add5f743eb7aa0 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -390,6 +390,11 @@ - (ScrollViewMetrics)_scrollViewMetrics metrics.contentInset = RCTEdgeInsetsFromUIEdgeInsets(_scrollView.contentInset); metrics.containerSize = RCTSizeFromCGSize(_scrollView.bounds.size); metrics.zoomScale = _scrollView.zoomScale; + + if (_layoutMetrics.layoutDirection == LayoutDirection::RightToLeft) { + metrics.contentOffset.x = metrics.contentSize.width - metrics.containerSize.width - metrics.contentOffset.x; + } + return metrics; } diff --git a/packages/react-native/React/Views/ScrollView/RCTScrollView.m b/packages/react-native/React/Views/ScrollView/RCTScrollView.m index 6bd4b708983908..16f300b97668d0 100644 --- a/packages/react-native/React/Views/ScrollView/RCTScrollView.m +++ b/packages/react-native/React/Views/ScrollView/RCTScrollView.m @@ -1038,9 +1038,15 @@ - (void)sendScrollEventWithName:(NSString *)eventName _coalescingKey++; _lastEmittedEventName = [eventName copy]; } + + CGPoint offset = scrollView.contentOffset; + if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) { + offset.x = scrollView.contentSize.width - scrollView.frame.size.width - offset.x; + } + RCTScrollEvent *scrollEvent = [[RCTScrollEvent alloc] initWithEventName:eventName reactTag:self.reactTag - scrollViewContentOffset:scrollView.contentOffset + scrollViewContentOffset:offset scrollViewContentInset:scrollView.contentInset scrollViewContentSize:scrollView.contentSize scrollViewFrame:scrollView.frame diff --git a/packages/virtualized-lists/Lists/VirtualizedList.js b/packages/virtualized-lists/Lists/VirtualizedList.js index e5ac5773d4d323..0306925242d145 100644 --- a/packages/virtualized-lists/Lists/VirtualizedList.js +++ b/packages/virtualized-lists/Lists/VirtualizedList.js @@ -1735,15 +1735,15 @@ class VirtualizedList extends StateSafePureComponent { _offsetFromScrollEvent(e: ScrollEvent): number { const {contentOffset, contentSize, layoutMeasurement} = e.nativeEvent; const {horizontal, rtl} = this._orientation(); - if (Platform.OS === 'ios' || !(horizontal && rtl)) { + if (horizontal && rtl) { + return ( + this._selectLength(contentSize) - + (this._selectOffset(contentOffset) + + this._selectLength(layoutMeasurement)) + ); + } else { return this._selectOffset(contentOffset); } - - return ( - this._selectLength(contentSize) - - (this._selectOffset(contentOffset) + - this._selectLength(layoutMeasurement)) - ); } _scheduleCellsToRenderUpdate(opts?: {allowImmediateExecution?: boolean}) {