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.

UnionTabView: a profile photo and custom badges living inside the Liquid Glass tab barCustom 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.

Note

UnionTabView is open source under the MIT license. It needs iOS 17 or later, builds with Swift 6, and installs through the Swift Package Manager. This post was written with Claude.