diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index 1a243af9701..8c95cdbc0b9 100644 --- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -22,7 +22,6 @@ #import "RCTConversions.h" #import "RCTEnhancedScrollView.h" #import "RCTFabricComponentsPlugins.h" -#import "RCTPullToRefreshViewComponentView.h" using namespace facebook::react; @@ -100,11 +99,6 @@ static void RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrol BOOL _shouldUpdateContentInsetAdjustmentBehavior; CGPoint _contentOffsetWhenClipped; - - __weak UIView *_contentView; - - CGRect _prevFirstVisibleFrame; - __weak UIView *_firstVisibleView; } + (RCTScrollViewComponentView *_Nullable)findScrollViewComponentViewForView:(UIView *)view @@ -154,17 +148,10 @@ static void RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrol #pragma mark - RCTMountingTransactionObserving -- (void)mountingTransactionWillMount:(const facebook::react::MountingTransaction &)transaction - withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry -{ - [self _prepareForMaintainVisibleScrollPosition]; -} - - (void)mountingTransactionDidMount:(MountingTransaction const &)transaction withSurfaceTelemetry:(facebook::react::SurfaceTelemetry const &)surfaceTelemetry { [self _remountChildren]; - [self _adjustForMaintainVisibleContentPosition]; } #pragma mark - RCTComponentViewProtocol @@ -349,23 +336,11 @@ static void RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrol - (void)mountChildComponentView:(UIView *)childComponentView index:(NSInteger)index { [_containerView insertSubview:childComponentView atIndex:index]; - if ([childComponentView isKindOfClass:RCTPullToRefreshViewComponentView.class]) { - // Ignore the pull to refresh component. - } else { - RCTAssert(_contentView == nil, @"RCTScrollView may only contain a single subview."); - _contentView = childComponentView; - } } - (void)unmountChildComponentView:(UIView *)childComponentView index:(NSInteger)index { [childComponentView removeFromSuperview]; - if ([childComponentView isKindOfClass:RCTPullToRefreshViewComponentView.class]) { - // Ignore the pull to refresh component. - } else { - RCTAssert(_contentView == childComponentView, @"Attempted to remove non-existent subview"); - _contentView = nil; - } } /* @@ -428,9 +403,6 @@ static void RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrol CGRect oldFrame = self.frame; self.frame = CGRectZero; self.frame = oldFrame; - _contentView = nil; - _prevFirstVisibleFrame = CGRectZero; - _firstVisibleView = nil; [super prepareForRecycle]; } @@ -711,74 +683,6 @@ static void RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrol [self.scrollViewDelegateSplitter removeDelegate:scrollListener]; } -#pragma mark - Maintain visible content position - -- (void)_prepareForMaintainVisibleScrollPosition -{ - const auto &props = *std::static_pointer_cast(_props); - if (!props.maintainVisibleContentPosition) { - return; - } - - BOOL horizontal = _scrollView.contentSize.width > self.frame.size.width; - int minIdx = props.maintainVisibleContentPosition.value().minIndexForVisible; - for (NSUInteger ii = minIdx; ii < _contentView.subviews.count; ++ii) { - // Find the first entirely visible view. - UIView *subview = _contentView.subviews[ii]; - BOOL hasNewView = NO; - if (horizontal) { - hasNewView = subview.frame.origin.x > _scrollView.contentOffset.x; - } else { - hasNewView = subview.frame.origin.y > _scrollView.contentOffset.y; - } - if (hasNewView || ii == _contentView.subviews.count - 1) { - _prevFirstVisibleFrame = subview.frame; - _firstVisibleView = subview; - break; - } - } -} - -- (void)_adjustForMaintainVisibleContentPosition -{ - const auto &props = *std::static_pointer_cast(_props); - if (!props.maintainVisibleContentPosition) { - return; - } - - std::optional autoscrollThreshold = props.maintainVisibleContentPosition.value().autoscrollToTopThreshold; - BOOL horizontal = _scrollView.contentSize.width > self.frame.size.width; - // TODO: detect and handle/ignore re-ordering - if (horizontal) { - CGFloat deltaX = _firstVisibleView.frame.origin.x - _prevFirstVisibleFrame.origin.x; - if (ABS(deltaX) > 0.5) { - CGFloat x = _scrollView.contentOffset.x; - [self _forceDispatchNextScrollEvent]; - _scrollView.contentOffset = CGPointMake(_scrollView.contentOffset.x + deltaX, _scrollView.contentOffset.y); - if (autoscrollThreshold) { - // If the offset WAS within the threshold of the start, animate to the start. - if (x <= autoscrollThreshold.value()) { - [self scrollToOffset:CGPointMake(0, _scrollView.contentOffset.y) animated:YES]; - } - } - } - } else { - CGRect newFrame = _firstVisibleView.frame; - CGFloat deltaY = newFrame.origin.y - _prevFirstVisibleFrame.origin.y; - if (ABS(deltaY) > 0.5) { - CGFloat y = _scrollView.contentOffset.y; - [self _forceDispatchNextScrollEvent]; - _scrollView.contentOffset = CGPointMake(_scrollView.contentOffset.x, _scrollView.contentOffset.y + deltaY); - if (autoscrollThreshold) { - // If the offset WAS within the threshold of the start, animate to the start. - if (y <= autoscrollThreshold.value()) { - [self scrollToOffset:CGPointMake(_scrollView.contentOffset.x, 0) animated:YES]; - } - } - } - } -} - @end Class RCTScrollViewCls(void) diff --git a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp index ef2cee93e9f..4f0d53929c9 100644 --- a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp +++ b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp @@ -127,15 +127,6 @@ ScrollViewProps::ScrollViewProps( "keyboardDismissMode", sourceProps.keyboardDismissMode, {})), - maintainVisibleContentPosition( - CoreFeatures::enablePropIteratorSetter - ? sourceProps.maintainVisibleContentPosition - : convertRawProp( - context, - rawProps, - "maintainVisibleContentPosition", - sourceProps.maintainVisibleContentPosition, - {})), maximumZoomScale( CoreFeatures::enablePropIteratorSetter ? sourceProps.maximumZoomScale @@ -346,7 +337,6 @@ void ScrollViewProps::setProp( RAW_SET_PROP_SWITCH_CASE_BASIC(directionalLockEnabled); RAW_SET_PROP_SWITCH_CASE_BASIC(indicatorStyle); RAW_SET_PROP_SWITCH_CASE_BASIC(keyboardDismissMode); - RAW_SET_PROP_SWITCH_CASE_BASIC(maintainVisibleContentPosition); RAW_SET_PROP_SWITCH_CASE_BASIC(maximumZoomScale); RAW_SET_PROP_SWITCH_CASE_BASIC(minimumZoomScale); RAW_SET_PROP_SWITCH_CASE_BASIC(scrollEnabled); @@ -423,10 +413,6 @@ SharedDebugStringConvertibleList ScrollViewProps::getDebugProps() const { "keyboardDismissMode", keyboardDismissMode, defaultScrollViewProps.keyboardDismissMode), - debugStringConvertibleItem( - "maintainVisibleContentPosition", - maintainVisibleContentPosition, - defaultScrollViewProps.maintainVisibleContentPosition), debugStringConvertibleItem( "maximumZoomScale", maximumZoomScale, diff --git a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h index c76c99eddda..bd53bc4bb22 100644 --- a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h +++ b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h @@ -11,8 +11,6 @@ #include #include -#include - namespace facebook { namespace react { @@ -45,8 +43,6 @@ class ScrollViewProps final : public ViewProps { bool directionalLockEnabled{}; ScrollViewIndicatorStyle indicatorStyle{}; ScrollViewKeyboardDismissMode keyboardDismissMode{}; - std::optional - maintainVisibleContentPosition{}; Float maximumZoomScale{1.0f}; Float minimumZoomScale{1.0f}; bool scrollEnabled{true}; diff --git a/ReactCommon/react/renderer/components/scrollview/conversions.h b/ReactCommon/react/renderer/components/scrollview/conversions.h index 3c888b48132..4605f08ea20 100644 --- a/ReactCommon/react/renderer/components/scrollview/conversions.h +++ b/ReactCommon/react/renderer/components/scrollview/conversions.h @@ -10,7 +10,6 @@ #include #include #include -#include namespace facebook { namespace react { @@ -99,26 +98,6 @@ inline void fromRawValue( abort(); } -inline void fromRawValue( - const PropsParserContext &context, - const RawValue &value, - ScrollViewMaintainVisibleContentPosition &result) { - auto map = (butter::map)value; - - auto minIndexForVisible = map.find("minIndexForVisible"); - if (minIndexForVisible != map.end()) { - fromRawValue( - context, minIndexForVisible->second, result.minIndexForVisible); - } - auto autoscrollToTopThreshold = map.find("autoscrollToTopThreshold"); - if (autoscrollToTopThreshold != map.end()) { - fromRawValue( - context, - autoscrollToTopThreshold->second, - result.autoscrollToTopThreshold); - } -} - inline std::string toString(const ScrollViewSnapToAlignment &value) { switch (value) { case ScrollViewSnapToAlignment::Start: @@ -130,8 +109,6 @@ inline std::string toString(const ScrollViewSnapToAlignment &value) { } } -#if RN_DEBUG_STRING_CONVERTIBLE - inline std::string toString(const ScrollViewIndicatorStyle &value) { switch (value) { case ScrollViewIndicatorStyle::Default: @@ -167,17 +144,5 @@ inline std::string toString(const ContentInsetAdjustmentBehavior &value) { } } -inline std::string toString( - const std::optional &value) { - if (!value) { - return "null"; - } - return "{minIndexForVisible: " + toString(value.value().minIndexForVisible) + - ", autoscrollToTopThreshold: " + - toString(value.value().autoscrollToTopThreshold) + "}"; -} - -#endif - } // namespace react } // namespace facebook diff --git a/ReactCommon/react/renderer/components/scrollview/primitives.h b/ReactCommon/react/renderer/components/scrollview/primitives.h index e627d767fa2..fe8a60e21d7 100644 --- a/ReactCommon/react/renderer/components/scrollview/primitives.h +++ b/ReactCommon/react/renderer/components/scrollview/primitives.h @@ -7,8 +7,6 @@ #pragma once -#include - namespace facebook { namespace react { @@ -25,20 +23,5 @@ enum class ContentInsetAdjustmentBehavior { Always }; -class ScrollViewMaintainVisibleContentPosition final { - public: - int minIndexForVisible{0}; - std::optional autoscrollToTopThreshold{}; - - bool operator==(const ScrollViewMaintainVisibleContentPosition &rhs) const { - return std::tie(this->minIndexForVisible, this->autoscrollToTopThreshold) == - std::tie(rhs.minIndexForVisible, rhs.autoscrollToTopThreshold); - } - - bool operator!=(const ScrollViewMaintainVisibleContentPosition &rhs) const { - return !(*this == rhs); - } -}; - } // namespace react } // namespace facebook diff --git a/ReactCommon/react/renderer/debug/DebugStringConvertible.h b/ReactCommon/react/renderer/debug/DebugStringConvertible.h index 7df17f01e39..a9a1ef02b4e 100644 --- a/ReactCommon/react/renderer/debug/DebugStringConvertible.h +++ b/ReactCommon/react/renderer/debug/DebugStringConvertible.h @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -99,14 +98,6 @@ std::string toString(float const &value); std::string toString(double const &value); std::string toString(void const *value); -template -std::string toString(const std::optional &value) { - if (!value) { - return "null"; - } - return toString(value.value()); -} - /* * *Informal* `DebugStringConvertible` interface. * diff --git a/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js b/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js index a7d7a8f8258..ec3b0d7a461 100644 --- a/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js +++ b/packages/rn-tester/js/examples/ScrollView/ScrollViewExample.js @@ -76,7 +76,7 @@ class AppendingList extends React.Component<