From 31273619058d1b58270e5440951426a9d824ceb6 Mon Sep 17 00:00:00 2001 From: Rami Elwan Date: Wed, 23 Jul 2025 12:41:42 +0200 Subject: [PATCH] fix: fix maintainVisibleContentPosition on iOS when _firstVisibleView is removed --- .../ScrollView/RCTScrollViewComponentView.mm | 9 +++++++++ 1 file changed, 9 insertions(+) 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