diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt index 56d63b9898..d700255473 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabsHostViewManager.kt @@ -142,6 +142,11 @@ class TabsHostViewManager : value: String?, ) = Unit + override fun setTabBarHidden( + view: TabsHost, + value: Boolean, + ) = Unit + // Android additional @ReactProp(name = "tabBarItemTitleFontColorActive", customType = "Color") diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java index 8f182c4f9a..de7a94843c 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerDelegate.java @@ -75,6 +75,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "tabBarControllerMode": mViewManager.setTabBarControllerMode(view, (String) value); break; + case "tabBarHidden": + mViewManager.setTabBarHidden(view, value == null ? false : (boolean) value); + break; case "controlNavigationStateInJS": mViewManager.setControlNavigationStateInJS(view, value == null ? false : (boolean) value); break; diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java index 24fbdae289..d5a1b6649b 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsManagerInterface.java @@ -31,5 +31,6 @@ public interface RNSBottomTabsManagerInterface { void setTabBarTintColor(T view, @Nullable Integer value); void setTabBarMinimizeBehavior(T view, @Nullable String value); void setTabBarControllerMode(T view, @Nullable String value); + void setTabBarHidden(T view, boolean value); void setControlNavigationStateInJS(T view, boolean value); } diff --git a/ios/bottom-tabs/RNSBottomTabsHostComponentView.h b/ios/bottom-tabs/RNSBottomTabsHostComponentView.h index 04eb070b32..2a0b30eda8 100644 --- a/ios/bottom-tabs/RNSBottomTabsHostComponentView.h +++ b/ios/bottom-tabs/RNSBottomTabsHostComponentView.h @@ -48,6 +48,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong, readonly, nullable) UIColor *tabBarTintColor; +@property (nonatomic, readonly) BOOL tabBarHidden; + @property (nonatomic, readonly) BOOL experimental_controlNavigationStateInJS; #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) diff --git a/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm b/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm index e5b111d996..757591c772 100644 --- a/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm +++ b/ios/bottom-tabs/RNSBottomTabsHostComponentView.mm @@ -253,6 +253,18 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props _tabBarTintColor = RCTUIColorFromSharedColor(newComponentProps.tabBarTintColor); } + if (newComponentProps.tabBarHidden != oldComponentProps.tabBarHidden) { + _tabBarHidden = newComponentProps.tabBarHidden; +#if RNS_IPHONE_OS_VERSION_AVAILABLE(18_0) + if (@available(iOS 18.0, *)) { + [_controller setTabBarHidden:_tabBarHidden animated:NO]; + } else +#endif // RNS_IPHONE_OS_VERSION_AVAILABLE(18_0) + { + _controller.tabBar.hidden = _tabBarHidden; + } + } + if (newComponentProps.tabBarMinimizeBehavior != oldComponentProps.tabBarMinimizeBehavior) { #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) if (@available(iOS 26.0, *)) { @@ -429,6 +441,19 @@ - (void)setTabBarTintColor:(UIColor *_Nullable)tabBarTintColor [self invalidateTabBarAppearance]; } +- (void)setTabBarHidden:(BOOL)tabBarHidden +{ + _tabBarHidden = tabBarHidden; +#if RNS_IPHONE_OS_VERSION_AVAILABLE(18_0) + if (@available(iOS 18.0, *)) { + [_controller setTabBarHidden:_tabBarHidden animated:NO]; + } else +#endif // RNS_IPHONE_OS_VERSION_AVAILABLE(18_0) + { + _controller.tabBar.hidden = _tabBarHidden; + } +} + // This is a Paper-only setter method that will be called by the mounting code. // It allows us to store UITabBarMinimizeBehavior in the component while accepting a custom enum as input from JS. - (void)setTabBarMinimizeBehaviorFromRNSTabBarMinimizeBehavior:(RNSTabBarMinimizeBehavior)tabBarMinimizeBehavior diff --git a/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm b/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm index 178ebae421..4859340b10 100644 --- a/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm +++ b/ios/bottom-tabs/RNSBottomTabsHostComponentViewManager.mm @@ -23,6 +23,7 @@ - (UIView *)view #pragma mark - LEGACY Props RCT_EXPORT_VIEW_PROPERTY(tabBarTintColor, UIColor); +RCT_EXPORT_VIEW_PROPERTY(tabBarHidden, BOOL); // This remapping allows us to store UITabBarMinimizeBehavior in the component while accepting a custom enum as input // from JS. RCT_REMAP_VIEW_PROPERTY( diff --git a/src/components/bottom-tabs/BottomTabs.types.ts b/src/components/bottom-tabs/BottomTabs.types.ts index d19d438cac..4dae7493ee 100644 --- a/src/components/bottom-tabs/BottomTabs.types.ts +++ b/src/components/bottom-tabs/BottomTabs.types.ts @@ -204,6 +204,14 @@ export interface BottomTabsProps extends ViewProps { * @supported iOS 18 or higher */ tabBarControllerMode?: TabBarControllerMode; + /** + * @summary Hides the tab bar. + * + * @default false + * + * @platform ios + */ + tabBarHidden?: boolean; // #endregion iOS-only appearance // #region Experimental support diff --git a/src/fabric/bottom-tabs/BottomTabsNativeComponent.ts b/src/fabric/bottom-tabs/BottomTabsNativeComponent.ts index a20e74fc3f..f56d3c91ba 100644 --- a/src/fabric/bottom-tabs/BottomTabsNativeComponent.ts +++ b/src/fabric/bottom-tabs/BottomTabsNativeComponent.ts @@ -64,6 +64,7 @@ export interface NativeProps extends ViewProps { tabBarTintColor?: ColorValue; tabBarMinimizeBehavior?: WithDefault; tabBarControllerMode?: WithDefault; + tabBarHidden?: WithDefault; // Control