If your React Native app uses native tabs from react-native-screens and runs on iPhone Duo, upgrade from 4.30.0 to 4.30.1. In 4.30.0, a cold launch with the phone unfolded can show no tab bar at all in the side rail. The fix in 4.30.1 is one line of Objective-C: size the tab bar controller’s view to its host before attaching it. We diffed the native sources of react-native-screens 4.30.0 and 4.30.1 (both from npm, 12 Nov 2026): seven iOS files change, nothing on Android, nothing in the JavaScript src/ folder. It is a drop-in patch.
Why we did this: our Beacon-type banking apps are React Native CLI apps with native tabs, and iPhone Duo is the first device where their tab bar does not come from a screen-sized window. We wanted to know what the patch touches before we bump it in a release branch.
How we checked
We ran npm pack react-native-screens@4.30.0 and @4.30.1, unpacked both, and ran diff -ruN over the package. The release notes on GitHub (4.30.1, 28 Oct 2026) say “This patch release backports a set of iOS fixes”, and the diff agrees.

Seven iOS files differ (one is new); android/ and src/ are identical.
The 197-line iOS diff splits into four changes:
| Change | Files | Upstream PR / issue |
|---|---|---|
| Tab bar missing on an unfolded iPhone Duo after a cold launch | ios/tabs/host/RNSTabsHostComponentView.mm |
#4990 |
| Other tab titles truncated when a search tab is present | ios/tabs/host/RNSTabBarController.mm |
#5057 |
| Header invisible after a cancelled zoom dismissal | ios/RNSScreenStackHeaderConfig.mm |
#5055 |
| Split view: large titles and a navigation item hook | ios/gamma/split/* (4 files) |
4.30.1 release |
The iPhone Duo fix
Issue #4989 (opened 19 Oct 2026) describes the bug on iOS 27.1, Xcode 27.1, Screens 4.30.0 and React Native 0.88: cold-launch the app while the phone is unfolded and the side-rail tab bar is missing. The UITabBar exists, but UIKit never builds its floating bar container. Folding and unfolding brings it back, and a folded cold launch works.
The reporter’s diagnosis: while the tab bar controller is detached, its view has the size of the cover display (466×678 points). When it is attached, it is resized to the unfolded canvas (951×669) without a size class change, and UIKit does not rebuild the tab bar on that resize. The fix sizes the view before it is attached:

Two lines added in didMoveToWindow; the upstream comment is longer, we shortened it for the card.
In the source the new lines read:
// Size the view to the host before attaching: the tabs were installed at the main screen's size and UIKit
// doesn't rebuild the tab bar on a later resize (iPhone Duo side rail).
// See https://github.com/software-mansion/react-native-screens/issues/4989.
_controller.view.frame = self.bounds;
The issue reports 0 of 3 unfolded cold launches with a visible bar before the fix and 3 of 3 after, on the iPhone Duo simulator. Those are the reporter’s numbers, not ours. The maintainer says the same bug reproduces in a plain UIKit app and was filed with Apple through Feedback Assistant.
What this means for a plain UIKit app
The lesson carries over to native code. If you create a UITabBarController (or any container that lays out a tab bar) before it is in a window, and add it as a child later, set its view’s frame to the container’s bounds before addChild and addSubview. On a phone with one screen size the early frame happens to be right. On iPhone Duo the main screen size and the window size differ when unfolded, and the tab bar keeps the layout it was given first.
// Before: child added with whatever frame the view had at creation
addChild(tabs)
view.addSubview(tabs.view)
// After: size it to the host first (same idea as the 4.30.1 fix)
tabs.view.frame = view.bounds
addChild(tabs)
view.addSubview(tabs.view)
tabs.didMove(toParent: self)
This Swift is our illustration of the pattern, not code from the package, and we have not compiled or run it.
Apple’s tech talk Strike a pose with adaptive layouts on iPhone Duo says that “standard system containers and presentations give you a lot of behavior for free”, and that tab bars lay out “vertically within the new safe area”. It does not mention this resize case, which is why a library had to work around it.
The other three fixes
UISearchTab title set at creation
With a tab using role: 'search', iOS 26.5 truncated the other tab titles on first appearance (#5015). 4.30.1 sets the title on the UISearchTab right after initWithViewControllerProvider:, the way initWithTitle: does for a normal tab:
NSString *_Nullable title = screenController.tabScreenComponentView.title;
if (title != nil) {
searchTab.title = title;
}
Header alpha after a cancelled zoom dismissal
On iOS 27.0, a screen pushed with a zoom transition whose interactive dismissal is cancelled could leave navigationBar.alpha at 0, so the back button disappears (#5054). 4.30.1 adds restoreNavigationBarAlphaIfTransitionIsCancelled:, about 60 lines. It runs only on iOS 18 and later, only for transitions with a preferredTransition, and registers one handler per transition with objc_setAssociatedObject on the transition coordinator. If the interaction is cancelled, it animates the bar back to its old alpha over transitionDuration * percentComplete. The source comment calls it a workaround for a UIKit bug, “Seen on iOS 26.5 and 27.0, not reproduced on 18.6”, to be removed once Apple fixes it.
Split view (gamma API)
The experimental split view now sets prefersLargeTitles = YES on column navigation bars, while each column defaults to largeTitleDisplayMode = .never. A new protocol, RNSNavigationItemCustomizing, lets a child view configure the column’s UINavigationItem. If you do not use the gamma split view, this does not affect you.
Upgrade steps
- Bump the package:
npm install react-native-screens@4.30.1. - Run
cd ios && pod install. Only iOS sources changed, so there is nothing to do on Android. - If you patched
RNSTabsHostComponentView.mmyourself withpatch-packageto work around the Duo bug, drop the patch. - React Navigation:
@react-navigation/bottom-tabshas had no release since 7.21.0 (13 Oct 2026), so there is nothing to pair with this bump.
Not run on a device yet
We did not build this on Xcode or run it on the iPhone Duo simulator. Everything above comes from the source diff, the upstream issues and the release notes. The check for SK is a cold launch of a native-tabs app, unfolded, on the iPhone Duo simulator in Xcode 27.2, on 4.30.0 and then 4.30.1. We will add the result here when we have it.



