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.
- package/RNScreens.podspec +29 -2
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +9 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +0 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +4 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +1 -1
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +4 -4
- package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingViewManager.kt +8 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAnimationDelegate.kt +1 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenEventEmitter.kt +16 -13
- package/android/src/main/java/com/swmansion/rnscreens/gamma/common/BaseEventEmitter.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/common/FragmentProviding.kt +11 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/common/NamingAwareEventType.kt +13 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/EventHelpers.kt +6 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/FragmentManagerHelper.kt +76 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/helpers/SystemDrawable.kt +33 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreen.kt +101 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenDelegate.kt +17 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenEventEmitter.kt +46 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenFragment.kt +37 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt +178 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHost.kt +433 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostEventEmitter.kt +14 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt +177 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidAppearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenDidDisappearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillAppearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabScreenWillDisappearEvent.kt +30 -0
- package/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/event/TabsHostNativeFocusChangeEvent.kt +36 -0
- package/android/src/main/java/com/swmansion/rnscreens/stack/views/ChildDrawingOrderStrategyImpl.kt +0 -1
- package/android/src/main/java/com/swmansion/rnscreens/transition/ExternalBoundaryValuesEvaluator.kt +9 -2
- package/android/src/main/java/com/swmansion/rnscreens/utils/FragmentTransactionKt.kt +4 -1
- package/android/src/main/jni/rnscreens.h +1 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +76 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +33 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +97 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +40 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledHeaderConfigViewGroup.kt +2 -2
- package/android/src/versioned/backgroundcolor/76/ViewBackgroundUtils.kt +0 -1
- package/android/src/versioned/backgroundcolor/latest/ViewBackgroundUtils.kt +0 -3
- package/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
- package/android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt +1 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsComponentDescriptor.h +31 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.cpp +20 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsShadowNode.h +32 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.cpp +22 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSBottomTabsState.h +44 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +8 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenComponentDescriptor.h +40 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.cpp +13 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenShadowNode.h +36 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenState.h +32 -0
- package/cpp/RNScreensTurboModule.h +5 -0
- package/ios/RNSEnums.h +6 -0
- package/ios/RNSScreen.h +2 -1
- package/ios/RNSScreen.mm +48 -1
- package/ios/RNSScreenContainer.mm +6 -0
- package/ios/RNSScreenStack.h +3 -1
- package/ios/RNSScreenStack.mm +39 -2
- package/ios/RNSScreenStackHeaderConfig.mm +1 -1
- package/ios/RNSScrollViewBehaviorOverriding.h +24 -0
- package/ios/RNSScrollViewFinder.h +13 -0
- package/ios/RNSScrollViewFinder.mm +22 -0
- package/ios/RNSScrollViewHelper.h +10 -0
- package/ios/RNSScrollViewHelper.mm +15 -0
- package/ios/RNScreens-Bridging-Header.h +4 -0
- package/ios/UIScrollView+RNScreens.h +14 -0
- package/ios/UIScrollView+RNScreens.mm +15 -0
- package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.h +18 -0
- package/ios/bottom-tabs/RCTConvert+RNSBottomTabs.mm +25 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentView.h +80 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm +486 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.h +11 -0
- package/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm +48 -0
- package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.h +53 -0
- package/ios/bottom-tabs/RNSBottomTabsHostEventEmitter.mm +57 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h +95 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm +492 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.h +9 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm +55 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.h +53 -0
- package/ios/bottom-tabs/RNSBottomTabsScreenEventEmitter.mm +106 -0
- package/ios/bottom-tabs/RNSBottomTabsSpecialEffectsSupporting.h +17 -0
- package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.h +34 -0
- package/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm +243 -0
- package/ios/bottom-tabs/RNSTabBarAppearanceProvider.h +23 -0
- package/ios/bottom-tabs/RNSTabBarController.h +132 -0
- package/ios/bottom-tabs/RNSTabBarController.mm +206 -0
- package/ios/bottom-tabs/RNSTabBarControllerDelegate.h +9 -0
- package/ios/bottom-tabs/RNSTabBarControllerDelegate.mm +63 -0
- package/ios/bottom-tabs/RNSTabsScreenViewController.h +42 -0
- package/ios/bottom-tabs/RNSTabsScreenViewController.mm +105 -0
- package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.h +21 -0
- package/ios/bottom-tabs/extensions/RNSBottomTabsHostComponentView+RNSImageLoader.mm +22 -0
- package/ios/bridging/RNSReactBaseView.h +31 -0
- package/ios/bridging/RNSReactBaseView.mm +5 -0
- package/ios/bridging/Swift-Bridging.h +7 -0
- package/ios/conversion/RNSConversions-BottomTabs.mm +216 -0
- package/ios/conversion/RNSConversions-SplitView.mm +63 -0
- package/ios/conversion/RNSConversions.h +53 -0
- package/ios/gamma/ReactMountingTransactionObserving.swift +7 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentView.h +29 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentView.mm +209 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.h +11 -0
- package/ios/gamma/split-view/RNSSplitViewHostComponentViewManager.mm +7 -0
- package/ios/gamma/split-view/RNSSplitViewHostController.swift +98 -0
- package/ios/gamma/split-view/RNSSplitViewNavigationController.swift +31 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentView.h +24 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentView.mm +106 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.h +11 -0
- package/ios/gamma/split-view/RNSSplitViewScreenComponentViewManager.mm +7 -0
- package/ios/gamma/split-view/RNSSplitViewScreenController.swift +86 -0
- package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.h +35 -0
- package/ios/gamma/split-view/RNSSplitViewScreenShadowStateProxy.mm +56 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentView.h +16 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentView.mm +143 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.h +11 -0
- package/ios/gamma/stack/RNSScreenStackHostComponentViewManager.mm +7 -0
- package/ios/gamma/stack/RNSStackController.swift +65 -0
- package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.h +37 -0
- package/ios/gamma/stack/RNSStackScreenComponentEventEmitter.mm +60 -0
- package/ios/gamma/stack/RNSStackScreenComponentView.h +36 -0
- package/ios/gamma/stack/RNSStackScreenComponentView.mm +124 -0
- package/ios/gamma/stack/RNSStackScreenComponentViewManager.h +11 -0
- package/ios/gamma/stack/RNSStackScreenComponentViewManager.mm +7 -0
- package/ios/gamma/stack/RNSStackScreenController.swift +56 -0
- package/ios/utils/NSString+RNSUtility.h +17 -0
- package/ios/utils/NSString+RNSUtility.mm +37 -0
- package/lib/commonjs/components/BottomTabs.js +54 -0
- package/lib/commonjs/components/BottomTabs.js.map +1 -0
- package/lib/commonjs/components/BottomTabsScreen.js +149 -0
- package/lib/commonjs/components/BottomTabsScreen.js.map +1 -0
- package/lib/commonjs/components/gamma/ScreenStackHost.js +27 -0
- package/lib/commonjs/components/gamma/ScreenStackHost.js.map +1 -0
- package/lib/commonjs/components/gamma/SplitViewHost.js +57 -0
- package/lib/commonjs/components/gamma/SplitViewHost.js.map +1 -0
- package/lib/commonjs/components/gamma/SplitViewScreen.js +22 -0
- package/lib/commonjs/components/gamma/SplitViewScreen.js.map +1 -0
- package/lib/commonjs/components/gamma/StackScreen.js +51 -0
- package/lib/commonjs/components/gamma/StackScreen.js.map +1 -0
- package/lib/commonjs/fabric/BottomTabsNativeComponent.js +19 -0
- package/lib/commonjs/fabric/BottomTabsNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js +14 -0
- package/lib/commonjs/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js +11 -0
- package/lib/commonjs/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js +11 -0
- package/lib/commonjs/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js +13 -0
- package/lib/commonjs/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js +12 -0
- package/lib/commonjs/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/flags.js +70 -0
- package/lib/commonjs/flags.js.map +1 -0
- package/lib/commonjs/index.js +66 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils.js +0 -28
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/module/components/BottomTabs.js +48 -0
- package/lib/module/components/BottomTabs.js.map +1 -0
- package/lib/module/components/BottomTabsScreen.js +144 -0
- package/lib/module/components/BottomTabsScreen.js.map +1 -0
- package/lib/module/components/gamma/ScreenStackHost.js +20 -0
- package/lib/module/components/gamma/ScreenStackHost.js.map +1 -0
- package/lib/module/components/gamma/SplitViewHost.js +50 -0
- package/lib/module/components/gamma/SplitViewHost.js.map +1 -0
- package/lib/module/components/gamma/SplitViewScreen.js +15 -0
- package/lib/module/components/gamma/SplitViewScreen.js.map +1 -0
- package/lib/module/components/gamma/StackScreen.js +44 -0
- package/lib/module/components/gamma/StackScreen.js.map +1 -0
- package/lib/module/fabric/BottomTabsNativeComponent.js +15 -0
- package/lib/module/fabric/BottomTabsNativeComponent.js.map +1 -0
- package/lib/module/fabric/BottomTabsScreenNativeComponent.js +12 -0
- package/lib/module/fabric/BottomTabsScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js +5 -0
- package/lib/module/fabric/gamma/ScreenStackHostNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js +5 -0
- package/lib/module/fabric/gamma/SplitViewHostNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js +7 -0
- package/lib/module/fabric/gamma/SplitViewScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/gamma/StackScreenNativeComponent.js +8 -0
- package/lib/module/fabric/gamma/StackScreenNativeComponent.js.map +1 -0
- package/lib/module/flags.js +64 -0
- package/lib/module/flags.js.map +1 -0
- package/lib/module/index.js +16 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils.js +0 -27
- package/lib/module/utils.js.map +1 -1
- package/lib/typescript/components/BottomTabs.d.ts +30 -0
- package/lib/typescript/components/BottomTabs.d.ts.map +1 -0
- package/lib/typescript/components/BottomTabsScreen.d.ts +56 -0
- package/lib/typescript/components/BottomTabsScreen.d.ts.map +1 -0
- package/lib/typescript/components/gamma/ScreenStackHost.d.ts +13 -0
- package/lib/typescript/components/gamma/ScreenStackHost.d.ts.map +1 -0
- package/lib/typescript/components/gamma/SplitViewHost.d.ts +13 -0
- package/lib/typescript/components/gamma/SplitViewHost.d.ts.map +1 -0
- package/lib/typescript/components/gamma/SplitViewScreen.d.ts +13 -0
- package/lib/typescript/components/gamma/SplitViewScreen.d.ts.map +1 -0
- package/lib/typescript/components/gamma/StackScreen.d.ts +21 -0
- package/lib/typescript/components/gamma/StackScreen.d.ts.map +1 -0
- package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts +31 -0
- package/lib/typescript/fabric/BottomTabsNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts +51 -0
- package/lib/typescript/fabric/BottomTabsScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/gamma/ScreenStackHostNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts +16 -0
- package/lib/typescript/fabric/gamma/SplitViewHostNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/gamma/SplitViewScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts +15 -0
- package/lib/typescript/fabric/gamma/StackScreenNativeComponent.d.ts.map +1 -0
- package/lib/typescript/flags.d.ts +45 -0
- package/lib/typescript/flags.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +14 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/utils.d.ts +0 -26
- package/lib/typescript/utils.d.ts.map +1 -1
- package/package.json +34 -6
- package/react-native.config.js +2 -1
- package/src/components/BottomTabs.tsx +115 -0
- package/src/components/BottomTabsScreen.tsx +291 -0
- package/src/components/gamma/ScreenStackHost.tsx +32 -0
- package/src/components/gamma/SplitViewHost.tsx +84 -0
- package/src/components/gamma/SplitViewScreen.tsx +26 -0
- package/src/components/gamma/StackScreen.tsx +64 -0
- package/src/fabric/BottomTabsNativeComponent.ts +82 -0
- package/src/fabric/BottomTabsScreenNativeComponent.ts +107 -0
- package/src/fabric/gamma/ScreenStackHostNativeComponent.ts +8 -0
- package/src/fabric/gamma/SplitViewHostNativeComponent.ts +39 -0
- package/src/fabric/gamma/SplitViewScreenNativeComponent.ts +10 -0
- package/src/fabric/gamma/StackScreenNativeComponent.ts +25 -0
- package/src/flags.ts +72 -0
- package/src/index.tsx +18 -1
- package/src/utils.ts +0 -28
package/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/PointerEventsBoxNoneImpl.kt
CHANGED
|
@@ -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
|
|
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
|
|
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
|
package/common/cpp/react/renderer/components/rnscreens/RNSSplitViewScreenComponentDescriptor.h
ADDED
|
@@ -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]]) {
|
package/ios/RNSScreenStack.h
CHANGED
|
@@ -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
|
|
13
|
+
@interface RNSNavigationController
|
|
14
|
+
: UINavigationController <RNSViewControllerDelegate, RNSBottomTabsSpecialEffectsSupporting>
|
|
13
15
|
|
|
14
16
|
@end
|
|
15
17
|
|
package/ios/RNSScreenStack.mm
CHANGED
|
@@ -27,9 +27,11 @@
|
|
|
27
27
|
#import "RNSScreenStackAnimator.h"
|
|
28
28
|
#import "RNSScreenStackHeaderConfig.h"
|
|
29
29
|
#import "RNSScreenWindowTraits.h"
|
|
30
|
-
#import "
|
|
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 =
|
|
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,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
|