WWDC25, the Xcode 26 and iOS 26 cycle, brought the Liquid Glass design language plus new tab, toolbar, and glass APIs. Building with Xcode 26 adopts the new look with almost no code changes; the new APIs are for refining it.
Liquid Glass arrives by recompiling
Navigation stacks, tabs, inspectors, and toolbars become glassy, rounder, and more transparent
by default. The NavigationStack API itself did not change.
Tabs: adopt the Tab API and the search role
The Tab API replaces the old TabView item style, and role: .search separates the search
tab from the others, docked at the bottom of the screen.
TabView {
Tab("feed", systemImage: "ruler") { feedTab }
Tab("insights", systemImage: "chart.xyaxis.line") {
NavigationStack { InsightsFeatureView() }
}
Tab("search", systemImage: "magnifyingglass", role: .search) {
NavigationStack { SearchFeatureView(store: searchStore) }
}
}
Toolbars: split groups with ToolbarSpacer
Toolbars render as glass groups. ToolbarSpacer breaks one toolbar into visually separate
clusters.
ToolbarItemGroup(placement: .topBarTrailing) {
Button("editor", systemImage: "pencil") { sheetShown = .editor }
}
ToolbarSpacer(.fixed, placement: .topBarTrailing)
ToolbarItemGroup(placement: .topBarTrailing) {
Button("glucose", systemImage: "carrot") { sheetShown = .bloodGlucose }
.buttonStyle(.glass)
}
Glass on your own views
buttonStyle(.glass) applies the glass button style. For any custom view, glassEffect() adds
the same material.
HStack { /* views */ }
.glassEffect()
Beyond the design language
TextEditor gains attributed string support. A native WebView ships with an observable
WebPage model that can load requests and customize the user agent. Apple also reported large
List and scroll performance gains on macOS and a new SwiftUI Instruments template.
import WebKit
struct BrowserView: View {
@State var page = WebPage()
var body: some View {
WebView(page)
.onAppear { page.load(URLRequest(url: URL(string: "https://google.com")!)) }
}
}