Skip to content

[iOS] NativeTabs (TabsHost): tap-on-active-tab scroll-to-top not triggering on native ScrollView #4102

@outaTiME

Description

@outaTiME

Description

Tapping the currently-active tab on NativeTabs (expo-router/unstable-native-tabs, backed by rn-screens TabsHost/RNSTabBarController) does not scroll the active screen's UIScrollView to the top.

disableScrollToTop is left at default (false) on the NativeTabs.Trigger, and the underlying scroll view has scrollsToTop = YES (the default for RN's <ScrollView>).

Expected: UIKit's standard "tap active tab to scroll to top" behavior fires (same as native iOS apps and direct UITabBarController usage).

Actual: nothing happens. The screen stays at the current scroll offset.

Inspected ios/tabs/host/*.mm — no scroll references, so the assumption is that the behavior is fully delegated to UIKit. The question is whether RNSTabBarController needs to explicitly opt into / forward this behavior (e.g. set scrollsToTop on the right descendant, or implement a UITabBarControllerDelegate scroll handler).

Steps to reproduce

  1. Use <NativeTabs> from expo-router/unstable-native-tabs as the tab layout.
  2. Inside one tab, render a plain RN <ScrollView> with enough content to scroll vertically.
  3. Run the app on iOS (device or simulator, iOS 26).
  4. Scroll the list down.
  5. Tap the currently active tab.
  6. Observe: scroll position does not reset to top.

Minimal code:

// app/(tabs)/_layout.tsx
import { NativeTabs } from 'expo-router/unstable-native-tabs';

export default () => (
  <NativeTabs>
    <NativeTabs.Trigger name="rates">
      <NativeTabs.Trigger.Icon sf="dollarsign.circle" />
      <NativeTabs.Trigger.Label>Rates</NativeTabs.Trigger.Label>
    </NativeTabs.Trigger>
  </NativeTabs>
);
// app/(tabs)/rates/index.tsx
import { ScrollView, View } from 'react-native';

export default () => (
  <ScrollView contentInsetAdjustmentBehavior="automatic">
    {Array.from({ length: 50 }).map((_, i) => (
      <View key={i} style={{ height: 80, backgroundColor: i % 2 ? '#eee' : '#fff' }} />
    ))}
  </ScrollView>
);

Snack or a link to a repository

Will provide a minimal repro repo if requested — the snippets above reproduce the behavior on any fresh Expo SDK 55 project with NativeTabs enabled. (Can attach a link in a follow-up comment.)

Screens version

4.24.0

React Native version

0.83.9

Platforms

iOS

JavaScript runtime

Hermes

Workflow

Expo bare workflow

Architecture

Fabric (New Architecture)

Build type

Debug mode

Device

Real device

Device model

iPhone (iOS 26)

Acknowledgements

Yes

Additional notes

  • Used to work with classic JS-based <Tabs> via useScrollToTop from @react-navigation/native. Migrating to NativeTabs as recommended for SDK 56 decoupling, where direct react-navigation usage is no longer allowed.
  • expo-router: 55.x (unstable-native-tabs).

Metadata

Metadata

Assignees

Labels

missing-reproThis issue need minimum repro scenarioplatform:iosIssue related to iOS part of the library

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