Expo Router Features You NEED to Implement for iOS 26

Beto   -   February 2026

You've seen it before. A React Native app in the wild that just looks like a React Native app. JavaScript bottom tabs, TouchableOpacity buttons, that slightly off platform feel.

For a long time, that was just the cost of going cross-platform.

But thanks to Software Mansion, Expo, and the React Native community, that tradeoff is finally disappearing.

Frameworks like Expo Router are exposing more native APIs, and the result is apps that feel genuinely at home on iOS. Not “close enough.” Actually native.

Why Native Primitives Equal Future-Proof Apps

Before I dive into the features, quick PSA: using native primitives makes your app future-proof.

Case in point: Liquid glass.

When Apple dropped it in iOS 26, it effectively broke every cross-platform framework that fakes Apple's UI. If your framework emulates UIKit instead of using it, you suddenly had a choice: ignore the new design language or refactor your entire UI system. Neither option is great.

Native iOS apps, on the other hand, got the new look for free. Recompile with Xcode 26, ship, done.

And since React Native is, well, native, we get iOS 26's latest features without the drama. Expo Router v55 exposes these APIs cleanly and declaratively, without forcing you to fight the platform.

In this post, I'll walk through the Expo Router features you should be using to make your app feel truly native on iOS 26. Especially now, with AI app generators everywhere, shipping an app is easier than ever. Standing out is the hard part.

If you prefer video, I put together a YouTube tutorial that walks through everything covered here.

Native Tabs

Native tabs use the system tab bar on both Android and iOS, so they automatically respond to system-level behaviors like liquid glass.

Inkigo using the new native tabs in iOS 26

Inkigo uses the minimizeBehavior prop to automatically minimize the tab bar when the user scrolls down.

Since trying on tattoos is Inkigo's core feature, we use role="search" for the camera view tab. This applies a set of default system behaviors, including a default title, a system symbol, and pinned behavior, where the tab is visually separated from the others.

Because of this, we manually set the icon to camera.fill when the tab is selected. You can see how this is configured in the code below.

Stack Toolbar

You can think of this as header items, but on steroids. The Stack.Toolbar component lets you place buttons, menus, spacers, custom views, and more, all using native primitives. This unlocks smooth, system-level animations when transitioning between screens.

Inkigo using the Stack Toolbar placement='right' in iOS 26

One of the highlights of Stack.Toolbar is the placement prop, which lets you position toolbar items on the left, right, or bottom of the screen. You can see how this is configured in the code below.

Stack Toolbar Position Bottom

The new toolbar component really shines when you use placement="bottom". With this placement, you can toggle items using the hidden prop and get a beautiful animated transition, complete with the liquid glass effect.

You can also place fully interactive elements here, including Menus. I shared an example showing how to implement a menu for the Endlessly app in this post on X.

Inkigo using the new stack toolbar placement bottom

Takeaway: Bottom toolbars like this are extremely hard to replicate convincingly with JavaScript. Native primitives give you system animations, layout behavior, and visual effects for free, which is exactly why they matter so much on iOS 26.

Bottom Accessory

In iOS 26, Apple introduced a new API that lets you attach an accessory, like the Mini Player in Music, to the tab bar. When expanded, the accessory sits above the tab bar. When the tab bar is minimized, the accessory animates inline with it.

A user can exit the minimized state by tapping a tab or scrolling to the top of the view.

I honestly haven't found a strong use case for this in Inkigo yet, but it's a great fit for real-time updates or long-running processes. You can think of it as a live activity inside your app.

I wouldn't recommend using this for static controls. If that's what you need, you're probably better off using a Stack Toolbar with placement="bottom" instead.

Inkigo using the new bottom accessory in iOS 26

Zoom Transition

Zoom transitions are one of my favorite APIs on iOS. They instantly level up an app by creating a strong sense of continuity through a beautiful, interactive animation.

This is a must-have for Inkigo. The app is built around tattoo imagery, so navigating from thumbnails to styles and detail screens is a perfect fit for zoom transitions. Instead of feeling like a hard screen change, the UI feels physically connected.

Zoom transitions were introduced in iOS 18 and allow you to create fluid, continuously interactive animations when navigating from a view or thumbnail to its destination. Users can grab, drag, and control the transition at any point, even mid-animation, which makes the experience feel incredibly natural.

Inkigo using the new zoom transition in iOS 26

Footers (Experimental)

If you've been building with React Native for a while, you know the bottom sheet struggle. Recent versions of React Native Screens give us a fully native sheet with detents, but styling content inside the sheet has historically been a bit buggy, especially when trying to pin actions to the bottom.

Now, with experimental footer support, flex: 1 behaves correctly inside the sheet, making it easy to keep a footer pinned to the bottom.

Inkigo uses this for a small easter egg that appears when the user expands the sign-in sheet.

This screen uses presentation: "formSheet" with sheetAllowedDetents: [0.41, 0.61].

Inkigo sign in sheet easter egg

Takeaway: If you want bottom-aligned actions inside a native sheet, this finally makes it reliable. No hacks, no layout jitter, just flex: 1.

Want to go deeper?

Inkigo is a real, shipped app, and all of the examples in this post come straight from production. If you're curious, you can download it from the App Store and explore how these patterns feel in a real app.

If you want to go beyond that, Pro Members get access to the full Inkigo source code, along with many other premium resources, including all my courses.

If you're serious about building apps that feel truly native, I go much deeper into this in my React Native course. It covers platform fallbacks, advanced Expo Router patterns like deep linking and authentication flows, and the kind of details that matter when shipping real apps.

I also share practical tips, experiments, and updates in my newsletter if you want to stay in the loop.

Want to partner with me? You can reach me at beto@codewithbeto.dev.

Let's connect!