Skip to content

iOS 26: header bar items re-created on native-bottom-tab refocus — liquid glass paints one default-light frame (flash in dark mode) #4163

@yigithanyucedag

Description

@yigithanyucedag

Description

When a native stack lives inside a native bottom tab host (react-native-bottom-tabs, real UITabBarController), the stack header's bar item subviews appear to be re-created every time the tab regains focus. On iOS 26 this is very visible in dark appearance: a freshly created bar item renders its first composited frame with the default (light) liquid-glass material before adapting, so every tab switch back to the screen produces a light "flash" on the header action buttons.

Notably, a custom headerTitle React view persists across tab refocus and never flashes — only left/right items do. Push/pop within the same stack does not flash either; it is specific to tab refocus.

What we ruled out

The flash reproduces with every variant of the right item we tried:

  • system item via unstable_headerRightItems{type: 'button', icon: {type: 'sfSymbol', ...}}
  • headerRight with a bare icon (system shared-background capsule)
  • headerRight / {type: 'custom'} with a custom glass view (UIGlassEffect wrapper), even with effect animations disabled and a fixed colorScheme — the first composited frame after (re)creation is still the default material
  • hidesSharedBackground: true (removes the capsule, so nothing flashes — but also removes the capsule)
  • freezeOnBlur is false (default), so this is not react-freeze remounting
  • Appearance.setColorScheme('dark') is set (native trait matches), and the screens/scenes have dark contentStyle/sceneStyle backgrounds

Since the title subview survives tab refocus while items do not, the asymmetry looks like it is in the header-config item application path rather than in the app.

Steps to reproduce

  1. RN new-arch app, dark appearance (Appearance.setColorScheme('dark')).
  2. react-native-bottom-tabs navigator; each tab hosts a @react-navigation/native-stack.
  3. Stack screen options:
    {
      headerShown: true,
      headerTransparent: true,
      headerTitle: () => <MyCapsuleTitle />, // custom view — never flashes
      unstable_headerRightItems: () => [
        {type: 'button', label: 'Settings', icon: {type: 'sfSymbol', name: 'gearshape'}, onPress},
      ],
    }
  4. Switch to another tab and back, repeatedly.
  5. Observe the right item's glass capsule flash light for ~1 frame on each refocus; the title capsule stays stable.

Expected behavior

Bar item subviews persist across tab refocus the same way the title view does (or the item appearance can be applied before first composite), so iOS 26 glass does not paint a default-material frame.

Snack or a link to a repository

Minimal reproduction repository (bare RN, no Expo — the involved native APIs aren't available in Snack): in preparation, will be linked in a follow-up comment shortly.

Screens version

4.24.0

React Native version

0.84.1 (new architecture)

Platforms

iOS

Additional environment

package version
@react-navigation/native-stack 7.14.5
react-native-bottom-tabs 1.3.0
iOS 26.3 simulator (also on device)

If the re-creation actually originates on the tab-host side, a pointer would help and I'll take it to react-native-bottom-tabs instead.

Metadata

Metadata

Assignees

No one assigned

    Labels

    platform:iosIssue related to iOS part of the libraryrepro-providedA reproduction with a snack or repo is provided

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions