Key changes
This release migrates the Tabs implementation on iOS 26.1 and newer to the UITab API (#4675) and extends the Tabs component with several new props: tabBarHiddenAnimationEnabled, tabBarSidebarPreferredPlacement, automaticallyActivatesSearch (backed by UISearchTab), and custom drawable or symbol tab bar icons with per-slot coloring and per-tab sizing (#4209). Header items in Stack v4 gain a visibilityPriority prop on iOS.
It also brings a number of fixes, most notably hardening of the Android fragment lifecycle (R8-safe restoration, orphaned fragment cleanup, and no crash during instance teardown) and corrections to form sheet scroll view handling on iOS.
Improvements
- iOS (Tabs): add the
tabBarHiddenAnimationEnabledprop by @ilcato in #4632 (resolves #4627) - iOS (Tabs): add the
tabBarSidebarPreferredPlacementprop to choose between the sidebar and the tab bar on iOS 27 by @Loloekk in #4668 - iOS (Tabs): migrate to the
UITabAPI on iOS 26.1 and newer by @kmichalikk in #4675 - iOS (Tabs): use
UISearchTabwith theautomaticallyActivatesSearchprop by @kmichalikk in #4679 - Tabs: custom drawable and symbol tab bar icons with per-slot coloring, per-tab size, indicator sizing, and an iOS fallback by @stachbial in #4209
- iOS (Stack v4): add the
visibilityPriorityprop to header items by @Loloekk in #4709
Bug fixes
iOS
- Form sheet: skip the scroll view frame correction once the screen is invalidated by @saddlepaddle in #4652
- Stack v4: stop the form sheet from resizing a recycled scroll view by @kkafar in #4791
- Stack v4: send the dismiss event to JS when the pop animation ends by @kacperzolkiewski in #4714
- Tabs: prevent the tab bar hidden animation on first render by @kkafar in #4673
- Tabs: enforce a consistent bottom accessory width by @kligarski in #4792
- Tabs: hide the "Edit" button in the sidebar when using the
UITabAPI by @kmichalikk in #4804 - Tabs: reorder tab image configuration calls by @kmichalikk in #4813
Android
- Make fragment restoration R8-safe by @ngocdevv in #4540
- Don't crash in
setupFabricduring instance teardown by @kkafar in #4790 - Restore touch coordinates after covered screens rotate by @savv in #4760
- Stack v4: don't run the header update for a screen detached from its stack by @nsingh-ut in #4498
- Stack v4: remove orphaned fragments when
ScreenContainerdetaches by @kkafar in #4814 - Tabs: let touches through the strip a hidden tab bar leaves behind by @dyankov91 in #4489
Misc
- iOS (FabricExample): use the scene lifecycle by default by @kligarski in #4676
- iOS (TVOSExample): use the scene lifecycle by default by @kligarski in #4710
- Android (Stack v4): remove the dead
ScreenModalFragmentand its helpers by @kkafar in #4795 - Tests: move the
tabBarSidebarPreferredPlacementtest to the component integration tests by @Loloekk in #4816
Source: 4.29.0 release notes on GitHub. Full changelog: 4.28.0...4.29.0.