Custom Liquid Glass tab bar
iOS 26 gave the tab bar a new look. It floats now, a frosted capsule that lifts off the content and refracts whatever scrolls behind it, with a selection pill that slides between items and a little haptic tap when it lands. Apple calls the material Liquid Glass, and it’s the nicest the tab bar has looked in years.
It’s also closed. You hand TabView a set of Labels, each one an SF Symbol and a string, and that’s the whole vocabulary. The moment you want something that isn’t a symbol — a profile photo in the last slot, a live badge that pulses, an avatar that loads from a URL — the glass quietly refuses. You get the beautiful bar or you get your custom view, not both.
You can build the bar yourself, and most people do — an HStack of buttons riding under the system one. But the hand-rolled versions always give themselves away on one of three details: the way scrolling content fades out under the bar instead of hard-clipping against it, the glass pill that slides behind the selected tab, and the live, refracting interactivity of the glass itself. Miss any one and it stops feeling like the system.
UnionTabView keeps all three, and still lets you drop any view you want into a slot.
Custom SwiftUI views, inside the real glass.
How to use
It’s a TabView that takes views instead of symbols. You pass your tabs, then a closure that builds each slot however you like:
import UnionTabView
UnionTabView(selection: $tab, tabs: Tab.allCases) {
HomeView().unionTab(Tab.home)
SearchView().unionTab(Tab.search)
ProfileView().unionTab(Tab.profile)
} item: { tab, isSelected in
if tab == .profile {
AsyncImage(url: user.avatarURL) { image in
image.resizable().scaledToFill()
} placeholder: {
Circle().fill(.gray.opacity(0.2))
}
.frame(width: 28, height: 28)
.clipShape(.circle)
.overlay(Circle().stroke(.blue, lineWidth: isSelected ? 2 : 0))
} else {
Image(systemName: tab.symbol)
.foregroundStyle(isSelected ? .primary : .secondary)
}
}A profile picture, ringed when it’s the active tab, sliding glass and all — in a tab bar that the platform says only holds symbols.
On older phones
The whole thing is gated on iOS 26. Below that there’s no Liquid Glass to imitate, so the package falls back to a clean custom capsule bar with the same sliding behavior — and crucially, the same call-site code. You write UnionTabView once and it renders glass where there’s glass and a tidy fallback where there isn’t. Nothing at your end branches on the OS version.
UnionTabView is on GitHub. Get the package.