From c429ee9974c731af18d649874cd29a2ed48965ec Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Thu, 13 Aug 2020 10:10:02 -0700 Subject: [PATCH] Implement ScrollView.contentInsetAdjustmentBehavior Summary: Changelog: [internal] Fabric's ScrollView was ignoring value of `ScrollView.contentInsetAdjustmentBehavior`, this diff fixes that. Reviewed By: shergin Differential Revision: D23102235 fbshipit-source-id: 8cf42e730b560a21d56d7e007059109ccd01154e --- .../ScrollView/RCTScrollViewComponentView.mm | 15 ++++++++ .../components/scrollview/ScrollViewProps.cpp | 7 +++- .../components/scrollview/ScrollViewProps.h | 2 ++ .../components/scrollview/conversions.h | 36 +++++++++++++++++++ .../components/scrollview/primitives.h | 7 ++++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index be3574835b7..438145381f3 100644 --- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -201,6 +201,21 @@ static void RCTSendPaperScrollEvent_DEPRECATED(UIScrollView *scrollView, NSInteg scrollView.snapToOffsets = snapToOffsets; } + if (@available(iOS 11.0, *)) { + if (oldScrollViewProps.contentInsetAdjustmentBehavior != newScrollViewProps.contentInsetAdjustmentBehavior) { + auto const contentInsetAdjustmentBehavior = newScrollViewProps.contentInsetAdjustmentBehavior; + if (contentInsetAdjustmentBehavior == ContentInsetAdjustmentBehavior::Never) { + scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } else if (contentInsetAdjustmentBehavior == ContentInsetAdjustmentBehavior::Automatic) { + scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic; + } else if (contentInsetAdjustmentBehavior == ContentInsetAdjustmentBehavior::ScrollableAxes) { + scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic; + } else if (contentInsetAdjustmentBehavior == ContentInsetAdjustmentBehavior::Always) { + scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAlways; + } + } + } + MAP_SCROLL_VIEW_PROP(disableIntervalMomentum); MAP_SCROLL_VIEW_PROP(snapToInterval); diff --git a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp index 7ea4cc2f925..feaa68d8ddb 100644 --- a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp +++ b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp @@ -159,7 +159,12 @@ ScrollViewProps::ScrollViewProps( snapToStart( convertRawProp(rawProps, "snapToStart", sourceProps.snapToStart, {})), snapToEnd( - convertRawProp(rawProps, "snapToEnd", sourceProps.snapToEnd, {})) {} + convertRawProp(rawProps, "snapToEnd", sourceProps.snapToEnd, {})), + contentInsetAdjustmentBehavior(convertRawProp( + rawProps, + "contentInsetAdjustmentBehavior", + sourceProps.contentInsetAdjustmentBehavior, + {ContentInsetAdjustmentBehavior::Never})) {} #pragma mark - DebugStringConvertible diff --git a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h index 4c5edbefab7..2a9c485f540 100644 --- a/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h +++ b/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h @@ -51,6 +51,8 @@ class ScrollViewProps final : public ViewProps { std::vector snapToOffsets{}; bool snapToStart{true}; bool snapToEnd{true}; + ContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior{ + ContentInsetAdjustmentBehavior::Never}; #pragma mark - DebugStringConvertible diff --git a/ReactCommon/react/renderer/components/scrollview/conversions.h b/ReactCommon/react/renderer/components/scrollview/conversions.h index 4d23000e23c..155e914723e 100644 --- a/ReactCommon/react/renderer/components/scrollview/conversions.h +++ b/ReactCommon/react/renderer/components/scrollview/conversions.h @@ -70,6 +70,29 @@ inline void fromRawValue( abort(); } +inline void fromRawValue( + const RawValue &value, + ContentInsetAdjustmentBehavior &result) { + auto string = (std::string)value; + if (string == "never") { + result = ContentInsetAdjustmentBehavior::Never; + return; + } + if (string == "automatic") { + result = ContentInsetAdjustmentBehavior::Automatic; + return; + } + if (string == "scrollableAxes") { + result = ContentInsetAdjustmentBehavior::ScrollableAxes; + return; + } + if (string == "always") { + result = ContentInsetAdjustmentBehavior::Always; + return; + } + abort(); +} + inline std::string toString(const ScrollViewSnapToAlignment &value) { switch (value) { case ScrollViewSnapToAlignment::Start: @@ -103,5 +126,18 @@ inline std::string toString(const ScrollViewKeyboardDismissMode &value) { } } +inline std::string toString(const ContentInsetAdjustmentBehavior &value) { + switch (value) { + case ContentInsetAdjustmentBehavior::Never: + return "never"; + case ContentInsetAdjustmentBehavior::Automatic: + return "automatic"; + case ContentInsetAdjustmentBehavior::ScrollableAxes: + return "scrollableAxes"; + case ContentInsetAdjustmentBehavior::Always: + return "always"; + } +} + } // namespace react } // namespace facebook diff --git a/ReactCommon/react/renderer/components/scrollview/primitives.h b/ReactCommon/react/renderer/components/scrollview/primitives.h index 0f75a54baf4..03cfd90c6ff 100644 --- a/ReactCommon/react/renderer/components/scrollview/primitives.h +++ b/ReactCommon/react/renderer/components/scrollview/primitives.h @@ -16,5 +16,12 @@ enum class ScrollViewIndicatorStyle { Default, Black, White }; enum class ScrollViewKeyboardDismissMode { None, OnDrag, Interactive }; +enum class ContentInsetAdjustmentBehavior { + Never, + Automatic, + ScrollableAxes, + Always +}; + } // namespace react } // namespace facebook