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
- 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. - Replace any
WKWebView-in-UIViewRepresentablewrapper withWebViewif you don't need deep navigation control. It's less code and one less place for retain-cycle bugs. - Adopt
TextEditor(text:)withAttributedStringfor any new notes or comment-composition feature. - Treat
.glassEffect()andGlassEffectContaineras 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.