Start with the controls Apple already made
On iOS 26 Apple draws Liquid Glass on its own controls: the tab bar, navigation bars, switches, sliders, segmented controls and menus. A React Native app gets that for free when it renders the real UIKit control and is built with Xcode 26. There is nothing to draw and nothing to tune, and it keeps matching when Apple adjusts the material.
In an Expo app that means:
- Tabs: Expo Router’s native tabs, which render the system
UITabBar, rather than a tab bar drawn in JavaScript. - Switch: React Native’s own
Switch, which isUISwitch. - Slider and segmented control:
@react-native-community/sliderand@react-native-segmented-control/segmented-control, which wrapUISliderandUISegmentedControl. - Menus: a native
UIMenu, through@react-native-menu/menu.
The trap is redrawing these yourself. A hand-drawn glass tab bar is more work, looks close but not right, and drifts further from the system every time Apple tunes it.
Use expo-glass-effect for the surfaces iOS does not give you
A floating card, a pill-shaped toolbar, a custom sheet: iOS has no control for these, so you draw the glass. expo-glass-effect wraps Apple’s UIGlassEffect as GlassView, and GlassContainer lets nearby glass shapes merge the way Apple’s own do.
It draws real glass only where the system has it. Check isLiquidGlassAvailable() and fall back to a BlurView from expo-blur on older iOS, so those phones get a frosted surface instead of nothing.
Glass goes blank in four predictable ways
These are the bugs you will hit, and none of them shows an error:
- Fading it. Animate the opacity of a view that contains glass, or of the glass itself, and it renders blank and stays blank. Scaling it to zero does the same. Move it with a
translatetransform instead. - Mounting it on demand over other glass. A glass pill that appears on top of a glass bar when you tap renders blank. Keep it mounted and change its props, or slide it in from off screen.
flex: 1inside a glass surface. The surface’s height resolves to zero and it draws nothing. UsealignSelf: "stretch"and an explicit height.- Clipping the native view. Keep
overflow: "hidden"and borders off the native glass view.
When glass draws nothing, put a plain View with a backgroundColor and a minHeight in the same slot before you touch any animation. A box with nothing in it means the child is collapsing. No box at all means the parent has no size.
Build it as a development build, with the right Xcode
Expo Go runs only the native modules it ships with, so an app that adds its own, like @react-native-menu/menu above, needs a development build:
npx expo run:ios
Watch the Xcode version too. Xcode 27 support is in progress: an Expo app built with Xcode 27 crashes at launch on iOS 27 unless it opts into the UIKit scene life cycle, which takes expo 57.0.23 or later and expo-build-properties 57.0.20 or later, with ios.enableSceneSupport. Expo SDK 56 and earlier cannot opt in; new exports turn it on, and Xcode 26 stays the requirement until we have run an Xcode 27 build on iOS 27.
Android does not have Liquid Glass
Liquid Glass is Apple’s. Google’s design language on Android is Material 3 Expressive: tonal colour, shapes that change as you press them, and spring motion. Copy translucent iOS glass onto Android and the app looks borrowed there.
So branch by platform. @expo/ui renders real Jetpack Compose Material 3 controls from React Native, which means one screen can show UISwitch on an iPhone and Material’s switch on a Pixel.
Or let the App Builder make these choices for you
In the App Builder, every block has already made this call: the real system control where iOS has one, glass built on expo-glass-effect with a blur fallback where it does not, and Material 3 Expressive on Android. Your coding agent builds the app from your design, and when it writes more code later, our free check_snippet tool flags all four traps above in the code it is shown. It is a text scan, not a guarantee, but it catches the common cases before they reach a phone.
Verified on iOS 26 and on Android 16 with Material 3 Expressive. iOS 27 support is in progress.
Open the App Builder and look at the tab bar on a starter app, on both platforms.