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 a3191aa43728..e5cae9289851 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -109,6 +109,7 @@ @implementation RCTScrollViewComponentView { __weak UIView *_contentView; CGRect _prevFirstVisibleFrame; + NSInteger _firstVisibleViewTag; __weak UIView *_firstVisibleView; CGFloat _endDraggingSensitivityMultiplier; @@ -677,6 +678,7 @@ - (void)prepareForRecycle self.frame = oldFrame; _contentView = nil; _prevFirstVisibleFrame = CGRectZero; + _firstVisibleViewTag = 0; _firstVisibleView = nil; } @@ -1036,6 +1038,7 @@ - (void)_prepareForMaintainVisibleScrollPosition } if (hasNewView || ii == _contentView.subviews.count - 1) { _prevFirstVisibleFrame = subview.frame; + _firstVisibleViewTag = subview.tag; _firstVisibleView = subview; break; } @@ -1049,6 +1052,12 @@ - (void)_adjustForMaintainVisibleContentPosition return; } + if(_firstVisibleView && _firstVisibleView.tag != _firstVisibleViewTag) { + _prevFirstVisibleFrame = CGRectZero; + _firstVisibleViewTag = 0; + _firstVisibleView = nil; + } + std::optional autoscrollThreshold = props.maintainVisibleContentPosition.value().autoscrollToTopThreshold; BOOL horizontal = _scrollView.contentSize.width > self.frame.size.width; // TODO: detect and handle/ignore re-ordering