Hello,
This issue stems from iOS's native UITabBarController
behavior, where the tab bar visibility state is maintained at the navigation controller level rather than per-page. Unlike Android, iOS doesn't automatically reset this state when navigating to new pages.
Recommended Workarounds
To restore the tab bar visibility, explicitly set it in code-behind before navigating:
Shell.SetTabBarIsVisible(this, true);
await Shell.Current.GoToAsync("yourNextPageRoute");
Alternative
If you're already on the destination page, set it in OnAppearing
:
protected override void OnAppearing()
{
base.OnAppearing();
Shell.SetTabBarIsVisible(this, true);
}
For maximum reliability on iOS, use this pattern:
protected override void OnAppearing()
{
base.OnAppearing();
// Immediate setting
Shell.SetTabBarIsVisible(this, true);
// Delayed setting to ensure iOS processes the change
MainThread.BeginInvokeOnMainThread(() =>
{
Shell.SetTabBarIsVisible(this, true);
});
}
Additional Notes
- Avoid using modal navigation (
PushModalAsync
) unless required, as it bypasses Shell behavior - Ensure that the navigation context is consistent—navigating from a hidden tab bar context can persist that state
- This issue affects .NET MAUI versions 6.0 through 9.0 and remains present in current releases
- Use
MainThread.BeginInvokeOnMainThread
instead ofDevice.BeginInvokeOnMainThread
(deprecated in .NET 6+) - Consider implementing a custom navigation service to centralize tab bar state management
Alternative Architecture Consideration
For apps heavily affected by this issue, consider:
- Using
TabbedPage
instead of Shell tabs for critical scenarios - Implementing custom navigation patterns that avoid the problematic state transitions
- Creating a centralized navigation service that manages tab bar visibility
References:
- TabBar disappears when navigating back from page with hidden TabBar
- Shell Bottom Tabs Disappear When Using Shell.TabBarIsVisible
- Setting Shell.TabBarIsVisible="False" breaks content for other pages on iOS
- Official Shell.SetTabBarIsVisible Documentation
I hope this helps resolve the issue.