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 9447552490a..1e72d941bc4 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -721,6 +721,29 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu [self _handleFinishedScrolling:scrollView]; } +- (void)didMoveToWindow +{ + [super didMoveToWindow]; + + if (!self.window) { + // The view is being removed, ensure that the scroll end event is dispatched + [self _handleScrollEndIfNeeded]; + } +} + +- (void)_handleScrollEndIfNeeded +{ + if (_scrollView.isDecelerating || !_scrollView.isTracking) { + if (!_eventEmitter) { + return; + } + static_cast(*_eventEmitter).onMomentumScrollEnd([self _scrollViewMetrics]); + + [self _updateStateWithContentOffset]; + _isUserTriggeredScrolling = NO; + } +} + - (void)_handleFinishedScrolling:(UIScrollView *)scrollView { [self _forceDispatchNextScrollEvent]; diff --git a/packages/react-native/React/Views/ScrollView/RCTScrollView.m b/packages/react-native/React/Views/ScrollView/RCTScrollView.m index 81bdc49c3ed..843bbd7cf85 100644 --- a/packages/react-native/React/Views/ScrollView/RCTScrollView.m +++ b/packages/react-native/React/Views/ScrollView/RCTScrollView.m @@ -848,6 +848,19 @@ RCT_SCROLL_EVENT_HANDLER(scrollViewDidScrollToTop, onScrollToTop) RCT_FORWARD_SCROLL_EVENT(scrollViewDidEndZooming : scrollView withView : view atScale : scale); } +- (void)didMoveToWindow +{ + [super didMoveToWindow]; + if (self.window == nil) { + // Check if the ScrollView was in motion + if (_scrollView.isDecelerating || !_scrollView.isTracking) { + // Trigger the onMomentumScrollEnd event manually + RCT_SEND_SCROLL_EVENT(onMomentumScrollEnd, nil); + RCT_FORWARD_SCROLL_EVENT(scrollViewDidEndDecelerating : _scrollView); + } + } +} + - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { // Fire a final scroll event