← All release notes
SwiftUIiOS 26Aug 27, 2026 · 5 min read

What's New in SwiftUI — iOS 26

Liquid Glass, a native WebView, rich text editing, and a redesigned tab bar — what iOS 26 actually changes for shipping apps.

iOS 26's SwiftUI release is less a grab-bag of point features and more a single design-language rollout — Liquid Glass — with a short list of API additions that close gaps developers have been working around for years: a real WebView, rich text in TextEditor, and a tab bar that finally does what most apps actually needed. Here's what shipped and what's worth touching first.

#Liquid Glass materials

.glassEffect() applies the new translucent, refractive material that's now the system-wide look for controls, toolbars, and sheets. It's a drop-in modifier for custom chrome you want to visually match system components.

Text("42")
    .padding()
    .glassEffect()

When you need several glass shapes to morph and blend into each other — say, a cluster of buttons that should read as one physical surface — wrap them in a GlassEffectContainer rather than applying .glassEffect() to each view independently; the container is what makes adjacent glass shapes merge instead of rendering as separate frosted blobs.

#Glass button and control styles

Standard controls get dedicated glass styles instead of requiring a manual .glassEffect() call.

Button("Continue") {}
    .buttonStyle(.glassProminent)

Reach for .glass on secondary actions and .glassProminent on the primary call-to-action in a screen — it reads correctly against both light and dark backgrounds without you hand-tuning opacity.

#WebView: native web content

SwiftUI finally ships a WebView, backed by WebKit's newer WebPage API, so embedding a web page no longer means wrapping WKWebView in a UIViewRepresentable.

import WebKit

struct ArticleView: View {
    var body: some View {
        WebView(url: URL(string: "https://swift.org")!)
    }
}

For anything beyond "load this URL" — observing navigation state, injecting scripts, driving loads programmatically — you back the view with a WebPage instance instead of a bare URL; treat the exact surface of that type as still settling and check current docs before committing to it.

#Tab bar redesign: search role and minimization

Tab now accepts a role, and .search pulls that tab out of the row into its own floating glass search field rather than sitting as a fifth icon.

TabView {
    Tab("Library", systemImage: "books.vertical") {
        LibraryView()
    }
    Tab("Search", systemImage: "magnifyingglass", role: .search) {
        SearchView()
    }
}

The tab bar also collapses as the user scrolls down content and expands again on scroll up, matching the system apps' behavior automatically — no manual scroll-offset tracking required. The exact modifier for opting out of that minimize behavior was still being finalized as of this release, so check current documentation before relying on a specific API name there.

#Rich text editing in TextEditor

TextEditor can now bind directly to an AttributedString, so basic rich text — bold, italics, links — no longer requires dropping down to UITextView.

struct NoteEditor: View {
    @State private var text = AttributedString("Draft")

    var body: some View {
        TextEditor(text: $text)
    }
}

This is the right default for any notes-style feature; only reach past it if you need custom formatting UI beyond what the system text-selection affordances give you.

#@Animatable macro

Custom Shape and View types with more than one animatable property used to require hand-writing an AnimatablePair-based animatableData implementation. The @Animatable macro synthesizes that conformance for you.

@Animatable
struct Ring: Shape {
    var radius: CGFloat
    var lineWidth: CGFloat

    func path(in rect: CGRect) -> Path {
        Path(ellipseIn: rect.insetBy(dx: lineWidth / 2, dy: lineWidth / 2))
    }
}

Use it the moment a custom shape or effect gains a second property you want to animate independently — it removes an entire category of boilerplate that used to make people avoid animating more than one value at a time.

#What to adopt first

  1. Rebuild against the iOS 26 SDK first and just look at your app. Standard NavigationStack, TabView, and toolbar chrome pick up Liquid Glass automatically with zero code changes — budget time for visual QA, not implementation.
  2. Replace any WKWebView-in-UIViewRepresentable wrapper with WebView if you don't need deep navigation control. It's less code and one less place for retain-cycle bugs.
  3. Adopt TextEditor(text:) with AttributedString for any new notes or comment-composition feature.
  4. Treat .glassEffect() and GlassEffectContainer as presentation-layer polish — apply them last, after layout is settled, since glass groupings are sensitive to view hierarchy changes.

The deployment-target reality: all of this requires iOS 26 as your minimum target, or if #available(iOS 26, *) branches everywhere glass, WebView, or the new Tab role is used. If your app still supports iOS 17 or 18 devices, plan on maintaining two visual codepaths for a release cycle rather than assuming Xcode 26's SDK alone gets you there.