iOS 27 brings a sweeping set of SwiftUI enhancements including Liquid Glass design adoption, new toolbar visibility and overflow APIs, document architecture improvements with Observable, and resizable iPhone app support β all designed to modernize app UIs with minimal code changes.
β’ Liquid Glass design is automatically applied to SwiftUI apps on 2027 OS releases with no code changes required
β’ New toolbar APIs: visibilityPriority modifier, ToolbarOverflowMenu container, and topBarPinnedTrailing placement replace manual workarounds for toolbar overflow
β’ Document API expanded: WritableDocument/ReadableDocument protocols with DocumentWriter/DocumentReader and nonisolated async write support replace FileDocument for document-based apps
β’ toolbarMinimizeBehavior(.onScrollDown) and prominentTab role added for richer navigation UX
β’ Liquid Glass design is automatically applied to existing SwiftUI apps with zero code changes, while new toolbar APIs (visibilityPriority, ToolbarOverflowMenu, topBarPinnedTrailing) give fine-grained control over what stays visible as windows resize
β’ The new DocumentGroup architecture with WritableDocument/ReadableDocument protocols and Observable integration enables high-performance, background-safe file I/O with granular progress reporting
β’ iPhone apps become resizable in iOS 27, and Xcode 27 Live Previews gain resize handles β making it essential to audit existing layouts for adaptive behavior
Demonstrates the new iOS 27 toolbar APIs β visibilityPriority for keeping key actions visible, ToolbarOverflowMenu for secondary actions, and topBarPinnedTrailing for a always-visible Share button β in a resizable SwiftUI view.
import SwiftUIβ// Pre-iOS 27: No visibilityPriority, no ToolbarOverflowMenu, no topBarPinnedTrailing.β// Developers manually managed overflow via conditional rendering or hidden menus.βstruct StickerEditorViewLegacy: View {+struct StickerEditorView: View {@State private var stickers: [String] = ["πΆ", "π±", "π"]@State private var isSharing = falseβ @Environment(\.horizontalSizeClass) private var sizeClass+ @State private var isExporting = false+ @Environment(\.appearsActive) private var appearsActivevar body: some View {ScrollView {LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))], spacing: 16) {ForEach(stickers, id: \.self) { sticker inText(sticker).font(.system(size: 48)).padding().background(.regularMaterial, in: RoundedRectangle(cornerRadius: 12))}}.padding()}.navigationTitle("Sticker Page").toolbar {β ToolbarItemGroup(placement: .navigationBarLeading) {+ // High-priority editing actions β keep visible when space is limited+ ToolbarItemGroup(placement: .automatic) {Button("Undo", systemImage: "arrow.uturn.backward") {stickers.removeLast()}Button("Redo", systemImage: "arrow.uturn.forward") {stickers.append("βοΈ")}}β ToolbarItemGroup(placement: .navigationBarTrailing) {β // All items competed for space with no priority control;β // compact size class required manual conditional hiding.β if sizeClass == .regular {β Button("Export", systemImage: "photo.on.rectangle") { }+ .visibilityPriority(.high)++ // Secondary actions always tucked into overflow menu+ ToolbarOverflowMenu {+ Button("Change Photo", systemImage: "photo") { }+ Button("Export as Image", systemImage: "photo.on.rectangle") {+ isExporting = true}β Menu {β Button("Change Photo") { }β Button("Clear", role: .destructive) { stickers.removeAll() }β } label: {β Image(systemName: "ellipsis.circle")+ Button("Clear Stickers", systemImage: "trash", role: .destructive) {+ stickers.removeAll()}+ }++ // Share button is always pinned to the trailing edge β never hidden+ ToolbarItem(placement: .topBarPinnedTrailing) {Button("Share", systemImage: "square.and.arrow.up") {isSharing = true}}}+ // Collapse nav bar on scroll down to maximise sticker grid space+ .toolbarMinimizeBehavior(.onScrollDown, for: .navigationBar)+ .sheet(isPresented: $isSharing) {+ ShareLink(items: stickers) {+ Label("Share Stickers", systemImage: "square.and.arrow.up")+ }+ .presentationDetents([.medium])+ }}}#Preview {NavigationStack {β StickerEditorViewLegacy()+ StickerEditorView()}}
Liquid Glass is Apple's new material and visual design language introduced in iOS 27, bringing translucent, refractive glass-like surfaces to system and custom UI elements. It replaces the frosted vibrancy aesthetic with a more dynamic, depth-aware material that responds to content beneath it.
PaperKit is Apple's full-featured canvas framework β previously internal-only β now publicly available in iOS/macOS/visionOS 27. It powers the drawing and markup experience in Notes, Preview, and Freeform, giving developers access to a complete pencil, shapes, images, and text canvas with a rich data model.
Xcode 27 introduces a fully customizable toolbar and theme system, untitled scratch projects, coding agent integration directly in the editor, and the new Device Hub for evaluating apps across simulators and physical devices side-by-side.
In-depth guide
SwiftUI & Liquid Glass in iOS 27 βThe new Document API requires conforming to WritableDocument and ReadableDocument rather than the older FileDocument/ReferenceFileDocument protocols. The Observable macro is required for the performance benefits β using ObservableObject will not give the same granular update behavior. toolbarMinimizeBehavior is placement-specific; applying it to wrong placements has no effect.
Liquid Glass slider tint and inactive window dimming require devices running iOS 27 / iPadOS 27 / macOS 26. Resizable iPhone requires iOS 27+.
iOS 27 introduces new SwiftUI drag and drop APIs including reorderable, reorderContainer, dragContainer, and configuration modifiers that enable reordering within and across collections, multi-item drag, and fine-grained control over how data is transferred during drag and drop operations.