react-native-screens 4.12.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/RNScreens.podspec +29 -2
  2. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +4 -0
  3. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +9 -1
  4. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +0 -1
  5. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +4 -4
  6. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +1 -1
  7. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +4 -4
  8. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingViewManager.kt +8 -2
  9. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAnimationDelegate.kt +1 -2
  10. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenEventEmitter.kt +16 -13
  11. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/BaseEventEmitter.kt +22 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/FragmentProviding.kt +11 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/gamma/common/NamingAwareEventType.kt +13 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/EventHelpers.kt +6 -0
  15. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/FragmentManagerHelper.kt +76 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/SystemDrawable.kt +33 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreen.kt +101 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenDelegate.kt +17 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenEventEmitter.kt +46 -0
  20. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenFragment.kt +37 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt +178 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHost.kt +433 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostEventEmitter.kt +14 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt +177 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidAppearEvent.kt +30 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidDisappearEvent.kt +30 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillAppearEvent.kt +30 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillDisappearEvent.kt +30 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabsHostNativeFocusChangeEvent.kt +36 -0
  30. package/android/src/main/java/com/swmansion/rnscreens/stack/views/ChildDrawingOrderStrategyImpl.kt +0 -1
  31. package/android/src/main/java/com/swmansion/rnscreens/transition/ExternalBoundaryValuesEvaluator.kt +9 -2
  32. package/android/src/main/java/com/swmansion/rnscreens/utils/FragmentTransactionKt.kt +4 -1
  33. package/android/src/main/jni/rnscreens.h +1 -0
  34. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +76 -0
  35. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +33 -0
  36. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +97 -0
  37. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +40 -0
  38. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +2 -2
  39. package/android/src/versioned/backgroundcolor/76/ViewBackgroundUtils.kt +0 -1
  40. package/android/src/versioned/backgroundcolor/latest/ViewBackgroundUtils.kt +0 -3
  41. package/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
  42. package/android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
  43. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsComponentDescriptor.h +31 -0
  44. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.cpp +20 -0
  45. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.h +32 -0
  46. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.cpp +22 -0
  47. package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.h +44 -0
  48. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +8 -0
  49. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenComponentDescriptor.h +40 -0
  50. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.cpp +13 -0
  51. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.h +36 -0
  52. package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenState.h +32 -0
  53. package/cpp/RNScreensTurboModule.h +5 -0
  54. package/ios/RNSEnums.h +6 -0
  55. package/ios/RNSScreen.h +2 -1
  56. package/ios/RNSScreen.mm +48 -1
  57. package/ios/RNSScreenContainer.mm +6 -0
  58. package/ios/RNSScreenStack.h +3 -1
  59. package/ios/RNSScreenStack.mm +39 -2
  60. package/ios/RNSScreenStackHeaderConfig.mm +1 -1
  61. package/ios/RNSScrollViewBehaviorOverriding.h +24 -0
  62. package/ios/RNSScrollViewFinder.h +13 -0
  63. package/ios/RNSScrollViewFinder.mm +22 -0
  64. package/ios/RNSScrollViewHelper.h +10 -0
  65. package/ios/RNSScrollViewHelper.mm +15 -0
  66. package/ios/RNScreens-Bridging-Header.h +4 -0
  67. package/ios/UIScrollView+RNScreens.h +14 -0
  68. package/ios/UIScrollView+RNScreens.mm +15 -0
  69. package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.h +18 -0
  70. package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.mm +25 -0
  71. package/ios/bottom-tabs/RNSBottomTabsHostComponentView.h +80 -0
  72. package/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm +486 -0
  73. package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.h +11 -0
  74. package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm +48 -0
  75. package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.h +53 -0
  76. package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.mm +57 -0
  77. package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h +95 -0
  78. package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm +492 -0
  79. package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.h +9 -0
  80. package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm +55 -0
  81. package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.h +53 -0
  82. package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.mm +106 -0
  83. package/ios/bottom-tabs/RNSBottomTabsSpecialEffectsSupporting.h +17 -0
  84. package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.h +34 -0
  85. package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm +243 -0
  86. package/ios/bottom-tabs/RNSTabBarAppearanceProvider.h +23 -0
  87. package/ios/bottom-tabs/RNSTabBarController.h +132 -0
  88. package/ios/bottom-tabs/RNSTabBarController.mm +206 -0
  89. package/ios/bottom-tabs/RNSTabBarControllerDelegate.h +9 -0
  90. package/ios/bottom-tabs/RNSTabBarControllerDelegate.mm +63 -0
  91. package/ios/bottom-tabs/RNSTabsScreenViewController.h +42 -0
  92. package/ios/bottom-tabs/RNSTabsScreenViewController.mm +105 -0
  93. package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.h +21 -0
  94. package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.mm +22 -0
  95. package/ios/bridging/RNSReactBaseView.h +31 -0
  96. package/ios/bridging/RNSReactBaseView.mm +5 -0
  97. package/ios/bridging/Swift-Bridging.h +7 -0
  98. package/ios/conversion/RNSConversions-BottomTabs.mm +216 -0
  99. package/ios/conversion/RNSConversions-SplitView.mm +63 -0
  100. package/ios/conversion/RNSConversions.h +53 -0
  101. package/ios/gamma/ReactMountingTransactionObserving.swift +7 -0
  102. package/ios/gamma/split-view/RNSSplitViewHostComponentView.h +29 -0
  103. package/ios/gamma/split-view/RNSSplitViewHostComponentView.mm +209 -0
  104. package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.h +11 -0
  105. package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.mm +7 -0
  106. package/ios/gamma/split-view/RNSSplitViewHostController.swift +98 -0
  107. package/ios/gamma/split-view/RNSSplitViewNavigationController.swift +31 -0
  108. package/ios/gamma/split-view/RNSSplitViewScreenComponentView.h +24 -0
  109. package/ios/gamma/split-view/RNSSplitViewScreenComponentView.mm +106 -0
  110. package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.h +11 -0
  111. package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.mm +7 -0
  112. package/ios/gamma/split-view/RNSSplitViewScreenController.swift +86 -0
  113. package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.h +35 -0
  114. package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.mm +56 -0
  115. package/ios/gamma/stack/RNSScreenStackHostComponentView.h +16 -0
  116. package/ios/gamma/stack/RNSScreenStackHostComponentView.mm +143 -0
  117. package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.h +11 -0
  118. package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.mm +7 -0
  119. package/ios/gamma/stack/RNSStackController.swift +65 -0
  120. package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.h +37 -0
  121. package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.mm +60 -0
  122. package/ios/gamma/stack/RNSStackScreenComponentView.h +36 -0
  123. package/ios/gamma/stack/RNSStackScreenComponentView.mm +124 -0
  124. package/ios/gamma/stack/RNSStackScreenComponentViewManager.h +11 -0
  125. package/ios/gamma/stack/RNSStackScreenComponentViewManager.mm +7 -0
  126. package/ios/gamma/stack/RNSStackScreenController.swift +56 -0
  127. package/ios/utils/NSString+RNSUtility.h +17 -0
  128. package/ios/utils/NSString+RNSUtility.mm +37 -0
  129. package/lib/commonjs/components/BottomTabs.js +54 -0
  130. package/lib/commonjs/components/BottomTabs.js.map +1 -0
  131. package/lib/commonjs/components/BottomTabsScreen.js +149 -0
  132. package/lib/commonjs/components/BottomTabsScreen.js.map +1 -0
  133. package/lib/commonjs/components/gamma/ScreenStackHost.js +27 -0
  134. package/lib/commonjs/components/gamma/ScreenStackHost.js.map +1 -0
  135. package/lib/commonjs/components/gamma/SplitViewHost.js +57 -0
  136. package/lib/commonjs/components/gamma/SplitViewHost.js.map +1 -0
  137. package/lib/commonjs/components/gamma/SplitViewScreen.js +22 -0
  138. package/lib/commonjs/components/gamma/SplitViewScreen.js.map +1 -0
  139. package/lib/commonjs/components/gamma/StackScreen.js +51 -0
  140. package/lib/commonjs/components/gamma/StackScreen.js.map +1 -0
  141. package/lib/commonjs/fabric/BottomTabsNativeComponent.js +19 -0
  142. package/lib/commonjs/fabric/BottomTabsNativeComponent.js.map +1 -0
  143. package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js +14 -0
  144. package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
  145. package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js +11 -0
  146. package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
  147. package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js +11 -0
  148. package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
  149. package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js +13 -0
  150. package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
  151. package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js +12 -0
  152. package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
  153. package/lib/commonjs/flags.js +70 -0
  154. package/lib/commonjs/flags.js.map +1 -0
  155. package/lib/commonjs/index.js +66 -3
  156. package/lib/commonjs/index.js.map +1 -1
  157. package/lib/commonjs/utils.js +0 -28
  158. package/lib/commonjs/utils.js.map +1 -1
  159. package/lib/module/components/BottomTabs.js +48 -0
  160. package/lib/module/components/BottomTabs.js.map +1 -0
  161. package/lib/module/components/BottomTabsScreen.js +144 -0
  162. package/lib/module/components/BottomTabsScreen.js.map +1 -0
  163. package/lib/module/components/gamma/ScreenStackHost.js +20 -0
  164. package/lib/module/components/gamma/ScreenStackHost.js.map +1 -0
  165. package/lib/module/components/gamma/SplitViewHost.js +50 -0
  166. package/lib/module/components/gamma/SplitViewHost.js.map +1 -0
  167. package/lib/module/components/gamma/SplitViewScreen.js +15 -0
  168. package/lib/module/components/gamma/SplitViewScreen.js.map +1 -0
  169. package/lib/module/components/gamma/StackScreen.js +44 -0
  170. package/lib/module/components/gamma/StackScreen.js.map +1 -0
  171. package/lib/module/fabric/BottomTabsNativeComponent.js +15 -0
  172. package/lib/module/fabric/BottomTabsNativeComponent.js.map +1 -0
  173. package/lib/module/fabric/BottomTabsScreenNativeComponent.js +12 -0
  174. package/lib/module/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
  175. package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js +5 -0
  176. package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
  177. package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js +5 -0
  178. package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
  179. package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js +7 -0
  180. package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
  181. package/lib/module/fabric/gamma/StackScreenNativeComponent.js +8 -0
  182. package/lib/module/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
  183. package/lib/module/flags.js +64 -0
  184. package/lib/module/flags.js.map +1 -0
  185. package/lib/module/index.js +16 -1
  186. package/lib/module/index.js.map +1 -1
  187. package/lib/module/utils.js +0 -27
  188. package/lib/module/utils.js.map +1 -1
  189. package/lib/typescript/components/BottomTabs.d.ts +30 -0
  190. package/lib/typescript/components/BottomTabs.d.ts.map +1 -0
  191. package/lib/typescript/components/BottomTabsScreen.d.ts +56 -0
  192. package/lib/typescript/components/BottomTabsScreen.d.ts.map +1 -0
  193. package/lib/typescript/components/gamma/ScreenStackHost.d.ts +13 -0
  194. package/lib/typescript/components/gamma/ScreenStackHost.d.ts.map +1 -0
  195. package/lib/typescript/components/gamma/SplitViewHost.d.ts +13 -0
  196. package/lib/typescript/components/gamma/SplitViewHost.d.ts.map +1 -0
  197. package/lib/typescript/components/gamma/SplitViewScreen.d.ts +13 -0
  198. package/lib/typescript/components/gamma/SplitViewScreen.d.ts.map +1 -0
  199. package/lib/typescript/components/gamma/StackScreen.d.ts +21 -0
  200. package/lib/typescript/components/gamma/StackScreen.d.ts.map +1 -0
  201. package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts +31 -0
  202. package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts.map +1 -0
  203. package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts +51 -0
  204. package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts.map +1 -0
  205. package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts +7 -0
  206. package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts.map +1 -0
  207. package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts +16 -0
  208. package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts.map +1 -0
  209. package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts +7 -0
  210. package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts.map +1 -0
  211. package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts +15 -0
  212. package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts.map +1 -0
  213. package/lib/typescript/flags.d.ts +45 -0
  214. package/lib/typescript/flags.d.ts.map +1 -0
  215. package/lib/typescript/index.d.ts +14 -1
  216. package/lib/typescript/index.d.ts.map +1 -1
  217. package/lib/typescript/utils.d.ts +0 -26
  218. package/lib/typescript/utils.d.ts.map +1 -1
  219. package/package.json +34 -6
  220. package/react-native.config.js +2 -1
  221. package/src/components/BottomTabs.tsx +115 -0
  222. package/src/components/BottomTabsScreen.tsx +291 -0
  223. package/src/components/gamma/ScreenStackHost.tsx +32 -0
  224. package/src/components/gamma/SplitViewHost.tsx +84 -0
  225. package/src/components/gamma/SplitViewScreen.tsx +26 -0
  226. package/src/components/gamma/StackScreen.tsx +64 -0
  227. package/src/fabric/BottomTabsNativeComponent.ts +82 -0
  228. package/src/fabric/BottomTabsScreenNativeComponent.ts +107 -0
  229. package/src/fabric/gamma/ScreenStackHostNativeComponent.ts +8 -0
  230. package/src/fabric/gamma/SplitViewHostNativeComponent.ts +39 -0
  231. package/src/fabric/gamma/SplitViewScreenNativeComponent.ts +10 -0
  232. package/src/fabric/gamma/StackScreenNativeComponent.ts +25 -0
  233. package/src/flags.ts +72 -0
  234. package/src/index.tsx +18 -1
  235. package/src/utils.ts +0 -28
@@ -3,7 +3,7 @@ package com.swmansion.rnscreens
3
3
  import com.facebook.react.uimanager.PointerEvents
4
4
  import com.facebook.react.uimanager.ReactPointerEventsView
5
5
 
6
- internal class PointerEventsBoxNoneImpl() : ReactPointerEventsView {
6
+ internal class PointerEventsBoxNoneImpl : ReactPointerEventsView {
7
7
  // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout
8
8
  // to be target of react gestures and effectively prevent interaction with screens
9
9
  // underneath the current screen (useful in `modal` & `formSheet` presentation).
@@ -3,7 +3,7 @@ package com.swmansion.rnscreens
3
3
  import com.facebook.react.uimanager.PointerEvents
4
4
  import com.facebook.react.uimanager.ReactPointerEventsView
5
5
 
6
- internal class PointerEventsBoxNoneImpl() : ReactPointerEventsView {
6
+ internal class PointerEventsBoxNoneImpl : ReactPointerEventsView {
7
7
  // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout
8
8
  // to be target of react gestures and effectively prevent interaction with screens
9
9
  // underneath the current screen (useful in `modal` & `formSheet` presentation).
@@ -0,0 +1,31 @@
1
+ #pragma once
2
+
3
+ #ifdef ANDROID
4
+ #include <fbjni/fbjni.h>
5
+ #endif
6
+ #include <react/debug/react_native_assert.h>
7
+ #include <react/renderer/components/rnscreens/Props.h>
8
+ #include <react/renderer/core/ConcreteComponentDescriptor.h>
9
+ #include "RNSBottomTabsShadowNode.h"
10
+
11
+ namespace facebook::react {
12
+
13
+ class RNSBottomTabsComponentDescriptor final
14
+ : public ConcreteComponentDescriptor<RNSBottomTabsShadowNode> {
15
+ public:
16
+ using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
17
+
18
+ void adopt(ShadowNode &shadowNode) const override {
19
+ react_native_assert(dynamic_cast<RNSBottomTabsShadowNode *>(&shadowNode));
20
+
21
+ ConcreteComponentDescriptor::adopt(shadowNode);
22
+ #if !defined(ANDROID)
23
+ auto &tabsShadowNode = static_cast<RNSBottomTabsShadowNode &>(shadowNode);
24
+ std::weak_ptr<void> imageLoader =
25
+ contextContainer_->at<std::shared_ptr<void>>("RCTImageLoader");
26
+ tabsShadowNode.setImageLoader(imageLoader);
27
+ #endif // !ANDROID
28
+ }
29
+ };
30
+
31
+ } // namespace facebook::react
@@ -0,0 +1,20 @@
1
+ #include "RNSBottomTabsShadowNode.h"
2
+
3
+ namespace facebook::react {
4
+
5
+ extern const char RNSBottomTabsComponentName[] = "RNSBottomTabs";
6
+
7
+ #if !defined(ANDROID)
8
+ void RNSBottomTabsShadowNode::setImageLoader(std::weak_ptr<void> imageLoader) {
9
+ getStateDataMutable().setImageLoader(imageLoader);
10
+ }
11
+
12
+ RNSBottomTabsShadowNode::StateData &
13
+ RNSBottomTabsShadowNode::getStateDataMutable() {
14
+ // We assume that this method is called to mutate the data, so we ensure
15
+ // we're unsealed.
16
+ ensureUnsealed();
17
+ return const_cast<RNSBottomTabsShadowNode::StateData &>(getStateData());
18
+ }
19
+ #endif // !ANDROID
20
+ } // namespace facebook::react
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+ #include <react/renderer/components/rnscreens/EventEmitters.h>
5
+ #include <react/renderer/components/rnscreens/Props.h>
6
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
7
+ #include "RNSBottomTabsState.h"
8
+
9
+ namespace facebook::react {
10
+
11
+ JSI_EXPORT extern const char RNSBottomTabsComponentName[];
12
+
13
+ class JSI_EXPORT RNSBottomTabsShadowNode final : public ConcreteViewShadowNode<
14
+ RNSBottomTabsComponentName,
15
+ RNSBottomTabsProps,
16
+ RNSBottomTabsEventEmitter,
17
+ RNSBottomTabsState> {
18
+ public:
19
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
20
+ using StateData = ConcreteViewShadowNode::ConcreteStateData;
21
+
22
+ #pragma mark - Custom interface
23
+
24
+ #if !defined(ANDROID)
25
+ void setImageLoader(std::weak_ptr<void> imageLoader);
26
+
27
+ private:
28
+ StateData &getStateDataMutable();
29
+ #endif // !ANDROID
30
+ };
31
+
32
+ } // namespace facebook::react
@@ -0,0 +1,22 @@
1
+ #include "RNSBottomTabsState.h"
2
+
3
+ namespace facebook {
4
+ namespace react {
5
+
6
+ #ifdef ANDROID
7
+ folly::dynamic RNSBottomTabsState::getDynamic() const {
8
+ return {};
9
+ }
10
+ #else // ANDROID
11
+
12
+ void RNSBottomTabsState::setImageLoader(std::weak_ptr<void> imageLoader) {
13
+ imageLoader_ = imageLoader;
14
+ }
15
+
16
+ std::weak_ptr<void> RNSBottomTabsState::getImageLoader() const noexcept {
17
+ return imageLoader_;
18
+ }
19
+ #endif // ANDROID
20
+
21
+ } // namespace react
22
+ } // namespace facebook
@@ -0,0 +1,44 @@
1
+ #pragma once
2
+
3
+ #include <react/renderer/core/graphicsConversions.h>
4
+ #include <react/renderer/graphics/Float.h>
5
+
6
+ #ifdef ANDROID
7
+ #include <folly/dynamic.h>
8
+ #include <react/renderer/mapbuffer/MapBuffer.h>
9
+ #include <react/renderer/mapbuffer/MapBufferBuilder.h>
10
+ #endif
11
+
12
+ namespace facebook::react {
13
+
14
+ class JSI_EXPORT RNSBottomTabsState final {
15
+ public:
16
+ using Shared = std::shared_ptr<const RNSBottomTabsState>;
17
+
18
+ RNSBottomTabsState() = default;
19
+
20
+ #ifdef ANDROID
21
+ RNSBottomTabsState(
22
+ RNSBottomTabsState const &previousState,
23
+ folly::dynamic data) {}
24
+ #endif
25
+
26
+ #ifdef ANDROID
27
+ folly::dynamic getDynamic() const;
28
+ MapBuffer getMapBuffer() const {
29
+ return MapBufferBuilder::EMPTY();
30
+ };
31
+ #else // ANDROID
32
+ void setImageLoader(std::weak_ptr<void> imageLoader);
33
+ std::weak_ptr<void> getImageLoader() const noexcept;
34
+ #endif // ANDROID
35
+
36
+ #pragma mark - Getters
37
+
38
+ private:
39
+ #if !defined(ANDROID)
40
+ std::weak_ptr<void> imageLoader_;
41
+ #endif // !ANDROID
42
+ };
43
+
44
+ } // namespace facebook::react
@@ -118,6 +118,14 @@ void RNSScreenShadowNode::appendChild(const ShadowNode::Shared &child) {
118
118
  void RNSScreenShadowNode::layout(facebook::react::LayoutContext layoutContext) {
119
119
  YogaLayoutableShadowNode::layout(layoutContext);
120
120
 
121
+ std::printf(
122
+ "ScreenSN [%d] layout {{%.2lf, %.2lf}, {%.2lf, %.2lf}}\n",
123
+ getTag(),
124
+ layoutMetrics_.frame.origin.x,
125
+ layoutMetrics_.frame.origin.y,
126
+ layoutMetrics_.frame.size.width,
127
+ layoutMetrics_.frame.size.height);
128
+
121
129
  #ifdef ANDROID
122
130
  applyFrameCorrections();
123
131
  #endif // ANDROID
@@ -0,0 +1,40 @@
1
+ #pragma once
2
+
3
+ #ifdef ANDROID
4
+ #include <fbjni/fbjni.h>
5
+ #endif // ANDROID
6
+ #include <react/renderer/core/ConcreteComponentDescriptor.h>
7
+ #include "RNSSplitViewScreenShadowNode.h"
8
+
9
+ namespace facebook::react {
10
+
11
+ class RNSSplitViewScreenComponentDescriptor final
12
+ : public ConcreteComponentDescriptor<RNSSplitViewScreenShadowNode> {
13
+ public:
14
+ using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
15
+
16
+ void adopt(ShadowNode &shadowNode) const override {
17
+ react_native_assert(
18
+ dynamic_cast<RNSSplitViewScreenShadowNode *>(&shadowNode));
19
+ auto &splitViewScreenShadowNode =
20
+ static_cast<RNSSplitViewScreenShadowNode &>(shadowNode);
21
+
22
+ react_native_assert(
23
+ dynamic_cast<YogaLayoutableShadowNode *>(&splitViewScreenShadowNode));
24
+ auto &layoutableShadowNode =
25
+ static_cast<YogaLayoutableShadowNode &>(splitViewScreenShadowNode);
26
+
27
+ auto state = std::static_pointer_cast<
28
+ const RNSSplitViewScreenShadowNode::ConcreteState>(
29
+ shadowNode.getState());
30
+ auto stateData = state->getData();
31
+
32
+ if (stateData.frameSize.width != 0 && stateData.frameSize.height != 0) {
33
+ layoutableShadowNode.setSize(stateData.frameSize);
34
+ }
35
+
36
+ ConcreteComponentDescriptor::adopt(shadowNode);
37
+ }
38
+ };
39
+
40
+ } // namespace facebook::react
@@ -0,0 +1,13 @@
1
+ #include "RNSSplitViewScreenShadowNode.h"
2
+
3
+ namespace facebook::react {
4
+
5
+ extern const char RNSSplitViewScreenComponentName[] = "RNSSplitViewScreen";
6
+
7
+ Point RNSSplitViewScreenShadowNode::getContentOriginOffset(
8
+ bool /*includeTransform*/) const {
9
+ auto stateData = getStateData();
10
+ return stateData.contentOffset;
11
+ }
12
+
13
+ } // namespace facebook::react
@@ -0,0 +1,36 @@
1
+ #pragma once
2
+
3
+ #include <jsi/jsi.h>
4
+ #include <react/renderer/components/rnscreens/EventEmitters.h>
5
+ #include <react/renderer/components/rnscreens/Props.h>
6
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
7
+ #include <react/renderer/core/LayoutContext.h>
8
+ #include "RNSSplitViewScreenState.h"
9
+
10
+ namespace facebook::react {
11
+
12
+ JSI_EXPORT extern const char RNSSplitViewScreenComponentName[];
13
+
14
+ using ConcreteViewShadowNodeSuperType = ConcreteViewShadowNode<
15
+ RNSSplitViewScreenComponentName,
16
+ RNSSplitViewScreenProps,
17
+ RNSSplitViewScreenEventEmitter,
18
+ RNSSplitViewScreenState>;
19
+
20
+ class JSI_EXPORT RNSSplitViewScreenShadowNode final
21
+ : public ConcreteViewShadowNodeSuperType {
22
+ public:
23
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
24
+ using StateData = ConcreteViewShadowNode::ConcreteStateData;
25
+
26
+ #pragma mark - ShadowNode overrides
27
+
28
+ Point getContentOriginOffset(bool includeTransform) const override;
29
+ static ShadowNodeTraits BaseTraits() {
30
+ auto traits = ConcreteViewShadowNode::BaseTraits();
31
+ traits.set(ShadowNodeTraits::Trait::RootNodeKind);
32
+ return traits;
33
+ }
34
+ };
35
+
36
+ } // namespace facebook::react
@@ -0,0 +1,32 @@
1
+ #pragma once
2
+
3
+ #if defined(ANDROID)
4
+ #include <folly/dynamic.h>
5
+ #include <react/renderer/mapbuffer/MapBuffer.h>
6
+ #include <react/renderer/mapbuffer/MapBufferBuilder.h>
7
+ #endif // ANDROID
8
+
9
+ namespace facebook::react {
10
+
11
+ class JSI_EXPORT RNSSplitViewScreenState final {
12
+ public:
13
+ using Shared = std::shared_ptr<const RNSSplitViewScreenState>;
14
+
15
+ RNSSplitViewScreenState(){};
16
+ RNSSplitViewScreenState(Size frameSize_, Point contentOffset_)
17
+ : frameSize(frameSize_), contentOffset(contentOffset_){};
18
+
19
+ const Size frameSize{};
20
+ const Point contentOffset{};
21
+
22
+ #if defined(ANDROID)
23
+ RNSSplitViewScreenState(
24
+ const RNSSplitViewScreenState &previousState,
25
+ folly::dynamic data) {}
26
+ folly::dynamic getDynamic() const {
27
+ return {};
28
+ }
29
+ #endif
30
+ };
31
+
32
+ } // namespace facebook::react
@@ -1,3 +1,6 @@
1
+ // Needed on Paper only to hide the files from Swift build process
2
+ #if defined(__cplusplus)
3
+
1
4
  #include <jsi/jsi.h>
2
5
  #include <array>
3
6
 
@@ -38,3 +41,5 @@ class RNScreensTurboModule : public jsi::HostObject {
38
41
  };
39
42
 
40
43
  } // namespace RNScreens
44
+
45
+ #endif // __cplusplus
package/ios/RNSEnums.h CHANGED
@@ -118,3 +118,9 @@ typedef NS_ENUM(NSInteger, RNSBlurEffectStyle) {
118
118
  API_UNAVAILABLE(watchos, tvos) = UIBlurEffectStyleSystemChromeMaterialDark
119
119
 
120
120
  } API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(watchos);
121
+
122
+ typedef NS_ENUM(NSInteger, RNSBottomTabsIconType) {
123
+ RNSBottomTabsIconTypeImage,
124
+ RNSBottomTabsIconTypeTemplate,
125
+ RNSBottomTabsIconTypeSfSymbol,
126
+ };
package/ios/RNSScreen.h CHANGED
@@ -4,6 +4,7 @@
4
4
  #import "RNSEnums.h"
5
5
  #import "RNSScreenContainer.h"
6
6
  #import "RNSScreenContentWrapper.h"
7
+ #import "RNSScrollViewBehaviorOverriding.h"
7
8
 
8
9
  #if RCT_NEW_ARCH_ENABLED
9
10
  #import <React/RCTViewComponentView.h>
@@ -55,7 +56,7 @@ namespace react = facebook::react;
55
56
  #else
56
57
  RCTView
57
58
  #endif
58
- <RNSScreenContentWrapperDelegate>
59
+ <RNSScreenContentWrapperDelegate, RNSScrollViewBehaviorOverriding>
59
60
 
60
61
  @property (nonatomic) BOOL fullScreenSwipeEnabled;
61
62
  @property (nonatomic) BOOL fullScreenSwipeShadowEnabled;
package/ios/RNSScreen.mm CHANGED
@@ -31,6 +31,8 @@
31
31
  #import "RNSScreenFooter.h"
32
32
  #import "RNSScreenStack.h"
33
33
  #import "RNSScreenStackHeaderConfig.h"
34
+ #import "RNSTabBarController.h"
35
+ #import "RNSScrollViewHelper.h"
34
36
 
35
37
  #import "RNSDefines.h"
36
38
  #import "UIView+RNSUtility.h"
@@ -1164,6 +1166,48 @@ RNS_IGNORE_SUPER_CALL_END
1164
1166
 
1165
1167
  #endif // !TARGET_OS_TV && !TARGET_OS_VISION
1166
1168
 
1169
+ - (void)setFrame:(CGRect)frame
1170
+ {
1171
+ NSLog(@"ScreenView [%ld] setFrame: %@", self.tag, NSStringFromCGRect(frame));
1172
+ [super setFrame:frame];
1173
+ }
1174
+
1175
+ - (void)setBounds:(CGRect)bounds
1176
+ {
1177
+ NSLog(@"ScreenView [%ld] setBounds: %@", self.tag, NSStringFromCGRect(bounds));
1178
+ [super setBounds:bounds];
1179
+ }
1180
+
1181
+ #pragma mark - RNSScrollViewBehaviorOverriding
1182
+
1183
+ - (BOOL)shouldOverrideScrollViewContentInsetAdjustmentBehavior
1184
+ {
1185
+ // RNSScreenView does not have a property to control this behavior.
1186
+ // It looks for parent that conforms to RNSScrollViewBehaviorOverriding to determine
1187
+ // if it should override ScrollView's behavior.
1188
+
1189
+ // As this method is called when RNSScreen willMoveToParentViewController
1190
+ // and view does not have superView yet, we need to use reactSuperViews.
1191
+ UIView *parent = [self reactSuperview];
1192
+
1193
+ while (parent != nil) {
1194
+ if ([parent respondsToSelector:@selector(shouldOverrideScrollViewContentInsetAdjustmentBehavior)]) {
1195
+ id<RNSScrollViewBehaviorOverriding> overrideProvider = static_cast<id<RNSScrollViewBehaviorOverriding>>(parent);
1196
+ return [overrideProvider shouldOverrideScrollViewContentInsetAdjustmentBehavior];
1197
+ }
1198
+ parent = [parent reactSuperview];
1199
+ }
1200
+
1201
+ return NO;
1202
+ }
1203
+
1204
+ - (void)overrideScrollViewBehaviorInFirstDescendantChainIfNeeded
1205
+ {
1206
+ if ([self shouldOverrideScrollViewContentInsetAdjustmentBehavior]) {
1207
+ [RNSScrollViewHelper overrideScrollViewBehaviorInFirstDescendantChainFrom:self];
1208
+ }
1209
+ }
1210
+
1167
1211
  #pragma mark - Fabric specific
1168
1212
  #ifdef RCT_NEW_ARCH_ENABLED
1169
1213
 
@@ -1551,13 +1595,14 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1551
1595
  // shown as a native modal, as the final dimensions of the modal on iOS 12+ are shorter than the
1552
1596
  // screen size
1553
1597
  BOOL isDisplayedWithinUINavController = [self.parentViewController isKindOfClass:[RNSNavigationController class]];
1598
+ BOOL isTabScreen = [self.parentViewController isKindOfClass:RNSTabBarController.class];
1554
1599
 
1555
1600
  // Calculate header height on modal open
1556
1601
  if (self.screenView.isPresentedAsNativeModal) {
1557
1602
  [self calculateAndNotifyHeaderHeightChangeIsModal:YES];
1558
1603
  }
1559
1604
 
1560
- if (isDisplayedWithinUINavController || self.screenView.isPresentedAsNativeModal) {
1605
+ if (isDisplayedWithinUINavController || isTabScreen || self.screenView.isPresentedAsNativeModal) {
1561
1606
  #ifdef RCT_NEW_ARCH_ENABLED
1562
1607
  [self.screenView updateBounds];
1563
1608
  #else
@@ -1670,6 +1715,8 @@ Class<RCTComponentViewProtocol> RNSScreenCls(void)
1670
1715
  if (responder != nil) {
1671
1716
  _previousFirstResponder = responder;
1672
1717
  }
1718
+ } else {
1719
+ [self.screenView overrideScrollViewBehaviorInFirstDescendantChainIfNeeded];
1673
1720
  }
1674
1721
  }
1675
1722
 
@@ -12,6 +12,8 @@ namespace react = facebook::react;
12
12
 
13
13
  #endif // RCT_NEW_ARCH_ENABLED
14
14
 
15
+ #pragma mark - RNSViewController
16
+
15
17
  @implementation RNSViewController
16
18
 
17
19
  #if !TARGET_OS_TV
@@ -54,6 +56,8 @@ namespace react = facebook::react;
54
56
 
55
57
  @end
56
58
 
59
+ #pragma mark - RNSScreenContainerView
60
+
57
61
  @implementation RNSScreenContainerView {
58
62
  BOOL _invalidated;
59
63
  NSMutableSet *_activeScreens;
@@ -262,6 +266,8 @@ RNS_IGNORE_SUPER_CALL_END
262
266
  [super load];
263
267
  }
264
268
 
269
+ #pragma mark - RCTViewComponentViewProtocol
270
+
265
271
  - (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
266
272
  {
267
273
  if (![childComponentView isKindOfClass:[RNSScreenView class]]) {
@@ -5,11 +5,13 @@
5
5
  #import <React/RCTViewManager.h>
6
6
  #endif
7
7
 
8
+ #import "RNSBottomTabsSpecialEffectsSupporting.h"
8
9
  #import "RNSScreenContainer.h"
9
10
 
10
11
  NS_ASSUME_NONNULL_BEGIN
11
12
 
12
- @interface RNSNavigationController : UINavigationController <RNSViewControllerDelegate>
13
+ @interface RNSNavigationController
14
+ : UINavigationController <RNSViewControllerDelegate, RNSBottomTabsSpecialEffectsSupporting>
13
15
 
14
16
  @end
15
17
 
@@ -27,9 +27,11 @@
27
27
  #import "RNSScreenStackAnimator.h"
28
28
  #import "RNSScreenStackHeaderConfig.h"
29
29
  #import "RNSScreenWindowTraits.h"
30
- #import "utils/UINavigationBar+RNSUtility.h"
31
-
30
+ #import "RNSScrollViewFinder.h"
31
+ #import "RNSTabsScreenViewController.h"
32
+ #import "UIScrollView+RNScreens.h"
32
33
  #import "UIView+RNSUtility.h"
34
+ #import "utils/UINavigationBar+RNSUtility.h"
33
35
 
34
36
  #ifdef RCT_NEW_ARCH_ENABLED
35
37
  namespace react = facebook::react;
@@ -136,6 +138,41 @@ namespace react = facebook::react;
136
138
  }
137
139
  #endif
138
140
 
141
+ - (void)willMoveToParentViewController:(UIViewController *)parent
142
+ {
143
+ [super willMoveToParentViewController:parent];
144
+ if ([self.parentViewController isKindOfClass:RNSTabsScreenViewController.class]) {
145
+ RNSTabsScreenViewController *previousParentTabsScreenVC =
146
+ static_cast<RNSTabsScreenViewController *>(self.parentViewController);
147
+ [previousParentTabsScreenVC clearTabsSpecialEffectsDelegateIfNeeded:self];
148
+ }
149
+ }
150
+
151
+ - (void)didMoveToParentViewController:(UIViewController *)parent
152
+ {
153
+ [super didMoveToParentViewController:parent];
154
+ if ([parent isKindOfClass:RNSTabsScreenViewController.class]) {
155
+ RNSTabsScreenViewController *parentTabsScreenVC = static_cast<RNSTabsScreenViewController *>(parent);
156
+ [parentTabsScreenVC setTabsSpecialEffectsDelegate:self];
157
+ }
158
+ }
159
+
160
+ - (bool)onRepeatedTabSelectionOfTabScreenController:(RNSTabsScreenViewController *)tabScreenController
161
+ {
162
+ if ([[self viewControllers] count] > 1 &&
163
+ tabScreenController.tabScreenComponentView.shouldUseRepeatedTabSelectionPopToRootSpecialEffect) {
164
+ return [[self popToRootViewControllerAnimated:true] count] > 0;
165
+ } else if (
166
+ [[self viewControllers] count] == 1 &&
167
+ tabScreenController.tabScreenComponentView.shouldUseRepeatedTabSelectionScrollToTopSpecialEffect) {
168
+ UIScrollView *scrollView =
169
+ [RNSScrollViewFinder findScrollViewInFirstDescendantChainFrom:[[self topViewController] view]];
170
+ return [scrollView rnscreens_scrollToTop];
171
+ }
172
+
173
+ return false;
174
+ }
175
+
139
176
  @end
140
177
 
141
178
  #if !TARGET_OS_TV && !TARGET_OS_VISION
@@ -554,7 +554,7 @@ RNS_IGNORE_SUPER_CALL_END
554
554
  if (!shouldHide && !config.translucent) {
555
555
  // when nav bar is not translucent we change edgesForExtendedLayout to avoid system laying out
556
556
  // the screen underneath navigation controllers
557
- vc.edgesForExtendedLayout = UIRectEdgeNone;
557
+ vc.edgesForExtendedLayout = UIRectEdgeAll - UIRectEdgeTop;
558
558
  } else {
559
559
  // system default is UIRectEdgeAll
560
560
  vc.edgesForExtendedLayout = UIRectEdgeAll;
@@ -0,0 +1,24 @@
1
+ #include <UIKit/UIKit.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ /**
6
+ * Views that require ScrollView contentInsetAdjustmentBehavior overriding should conform to this protocol.
7
+ */
8
+ @protocol RNSScrollViewBehaviorOverriding
9
+
10
+ /**
11
+ * Returns whether view should override contentInsetAdjustmentBehavior for first ScrollView in first descendant chain.
12
+ * It can be a property or method involving some logic to determine if ScrollView's behavior should be overriden.
13
+ */
14
+ - (BOOL)shouldOverrideScrollViewContentInsetAdjustmentBehavior;
15
+
16
+ /**
17
+ * Overrides contentInsetAdjustmentBehavior for first ScrollView in first descendant chain
18
+ * if overrideScrollViewContentInsetAdjustmentBehavior returns true.
19
+ */
20
+ - (void)overrideScrollViewBehaviorInFirstDescendantChainIfNeeded;
21
+
22
+ @end
23
+
24
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,13 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ @interface RNSScrollViewFinder : NSObject
4
+
5
+ /**
6
+ * Finds UIScrollView by traversing down the hierarchy using first subview, similar to UIKit behavior.
7
+ * It will fail if:
8
+ * - UIScrollView is not a first subview of view or one of its descendants in the hierarchy,
9
+ * - if UIScrollView's parent is not yet attached.
10
+ */
11
+ + (nullable UIScrollView *)findScrollViewInFirstDescendantChainFrom:(nullable UIView *)view;
12
+
13
+ @end
@@ -0,0 +1,22 @@
1
+ #import "RNSScrollViewFinder.h"
2
+
3
+ @implementation RNSScrollViewFinder
4
+
5
+ + (UIScrollView *)findScrollViewInFirstDescendantChainFrom:(UIView *)view
6
+ {
7
+ UIView *currentView = view;
8
+
9
+ while (currentView != nil) {
10
+ if ([currentView isKindOfClass:UIScrollView.class]) {
11
+ return static_cast<UIScrollView *>(currentView);
12
+ } else if ([currentView.subviews count] > 0) {
13
+ currentView = currentView.subviews[0];
14
+ } else {
15
+ break;
16
+ }
17
+ }
18
+
19
+ return nil;
20
+ }
21
+
22
+ @end
@@ -0,0 +1,10 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ @interface RNSScrollViewHelper : NSObject
4
+
5
+ /**
6
+ * Finds and overrides contentInsetAdjustmentBehavior for first ScrollView in first descendant chain from view.
7
+ */
8
+ + (void)overrideScrollViewBehaviorInFirstDescendantChainFrom:(nullable UIView *)view;
9
+
10
+ @end
@@ -0,0 +1,15 @@
1
+ #import "RNSScrollViewHelper.h"
2
+ #import "RNSScrollViewFinder.h"
3
+
4
+ @implementation RNSScrollViewHelper
5
+
6
+ + (void)overrideScrollViewBehaviorInFirstDescendantChainFrom:(nullable UIView *)view
7
+ {
8
+ UIScrollView *scrollView = [RNSScrollViewFinder findScrollViewInFirstDescendantChainFrom:view];
9
+
10
+ if ([scrollView contentInsetAdjustmentBehavior] == UIScrollViewContentInsetAdjustmentNever) {
11
+ [scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentAutomatic];
12
+ }
13
+ }
14
+
15
+ @end
@@ -0,0 +1,4 @@
1
+ //
2
+ // Use this file to import your target's public headers that you would like to
3
+ // expose to Swift.
4
+ //
@@ -0,0 +1,14 @@
1
+ #import <UIKit/UIKit.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ @interface UIScrollView (RNScreens)
6
+ /**
7
+ * Scrolls to top taking into account adjustedContentInset.
8
+ * Returns true if scroll was necessary, false if ScrollView was already at the top.
9
+ */
10
+ - (BOOL)rnscreens_scrollToTop;
11
+
12
+ @end
13
+
14
+ NS_ASSUME_NONNULL_END