iOS 26's SwiftUI release is less a grab-bag of point features and more a single design-language rollout called Liquid Glass. Alongside it comes 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.
#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()
Sometimes 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. Without the container, adjacent glass shapes render as separate frosted blobs instead of merging.
#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. Both read correctly against 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", such as observing navigation state, injecting scripts, or 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. 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, so budget time for visual QA rather than 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.
All of this requires iOS 26 as your minimum deployment 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.