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]; }