From d105c2c6fe3ba9c4b7ffe63547ac0f6ecb361f2a Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Wed, 4 Dec 2024 07:49:12 -0800 Subject: [PATCH] Fabric: Fixes insets not adjust when keyboard disappear (#47924) Summary: Fixes https://github.com/facebook/react-native/issues/47731 . [IOS] [FIXED] - Fabric: Fixes insets not adjust when keyboard disappear Pull Request resolved: https://github.com/facebook/react-native/pull/47924 Test Plan: Demo in https://github.com/facebook/react-native/issues/47731 Reviewed By: blakef Differential Revision: D66651865 Pulled By: cipolleschi fbshipit-source-id: a75afbd1a7651f0c77022d913f910821c482fcf7 --- .../ScrollView/RCTScrollViewComponentView.mm | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) 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 f70e09b948f..3686c37d4c4 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -188,10 +188,11 @@ RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrollView, NSInt UIEdgeInsets newEdgeInsets = _scrollView.contentInset; CGFloat inset = MAX(scrollViewLowerY - keyboardEndFrame.origin.y, 0); + const auto &props = static_cast(*_props); if (isInverted) { - newEdgeInsets.top = MAX(inset, _scrollView.contentInset.top); + newEdgeInsets.top = MAX(inset, props.contentInset.top); } else { - newEdgeInsets.bottom = MAX(inset, _scrollView.contentInset.bottom); + newEdgeInsets.bottom = MAX(inset, props.contentInset.bottom); } CGPoint newContentOffset = _scrollView.contentOffset; @@ -203,21 +204,18 @@ RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrollView, NSInt from:self forEvent:nil]) { if (CGRectEqualToRect(_firstResponderFocus, CGRectNull)) { - // Text input view is outside of the scroll view. - return; - } - - CGRect viewIntersection = CGRectIntersection(self.firstResponderFocus, keyboardEndFrame); - - if (CGRectIsNull(viewIntersection)) { - return; - } - - // Inner text field focused - CGFloat focusEnd = CGRectGetMaxY(self.firstResponderFocus); - if (focusEnd > keyboardEndFrame.origin.y) { - // Text field active region is below visible area with keyboard - update diff to bring into view - contentDiff = keyboardEndFrame.origin.y - focusEnd; + UIView *inputAccessoryView = _firstResponderViewOutsideScrollView.inputAccessoryView; + if (inputAccessoryView) { + // Text input view is within the inputAccessoryView. + contentDiff = keyboardEndFrame.origin.y - keyboardBeginFrame.origin.y; + } + } else { + // Inner text field focused + CGFloat focusEnd = CGRectGetMaxY(self.firstResponderFocus); + if (focusEnd > keyboardEndFrame.origin.y) { + // Text field active region is below visible area with keyboard - update diff to bring into view + contentDiff = keyboardEndFrame.origin.y - focusEnd; + } } } @@ -243,7 +241,7 @@ RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrollView, NSInt animations:^{ self->_scrollView.contentInset = newEdgeInsets; self->_scrollView.verticalScrollIndicatorInsets = newEdgeInsets; - [self scrollToOffset:newContentOffset animated:NO]; + [self scrollTo:newContentOffset.x y:newContentOffset.y animated:NO]; } completion:nil]; }