- Refreshed look and feel
- Document based apps
- Presentation and interactions
- Data flow and Performance
Refreshed Look and Feel
New appearsActive environment property to observe whether the window is active, letting you adapt UI when a window loses focus.

iPad and Mac menu bar's default behavior — showing icon with title — has changed to text-only. The existing modifier can override this.

Xcode SwiftUI previews now have resizability handles.

These handles hint at foldable iPhone support and surface best practices around adaptive layouts.

New tab role to make a trailing tab bar item stand out — similar to how the search tab already behaves in iOS 26.

When resizing an app, the OS now auto-hides tab bar items into an Overflow Menu. To control which items get hidden last, use the new .visibilityPriority() modifier on ToolbarItemGroup.

A new ToolbarOverflowMenu container lets you opt specific items into the overflow menu explicitly.

For items that should never be hidden regardless of window size, there is a new placement option in the ToolbarItem API: topBarPinnedTrailing.

New toolbarMinimizeBehavior modifier to hide the toolbar on scroll.

Document Based Apps
Multiple new APIs for document-based apps.

New creation context API to start a document from different starting points.

WritableDocument with DocumentWriter and ReadableDocument with DocumentReader protocols provide sensible callbacks to optimize reading and writing based on snapshots — a type you control that represents the document state at a given point in time.

Presentation and Interactions
New .reorderable modifier and .reorderContainer modifier make it easy to support drag and drop in views beyond just lists.

More on these in the dedicated session: Code-along: Build powerful drag and drop in SwiftUI
Swipe actions now work on any view container — not just List — by combining .swipeActions with a .swipeActionContainer modifier on the ForEach container.

New item-binding based API for confirmation dialogs and alerts: the dialog or alert is shown when the bound item is non-nil.


Data Flow and Performance
AsyncImage now supports HTTP caching via URLCache by default, respecting the caching policy set by your server. Pass a custom URLRequest to override the cache policy.

You can also swap the underlying URLSession to control cache size.

@State has been refactored from a dynamic property into a macro. Previously, @State-stored @Observable objects were initialized multiple times when a parent view updated, even though the stored object stayed the same and the extra instances were immediately discarded. This is now fixed — and the fix is back-ported to iOS 17.


This change can be a breaking change when building with Xcode 27: if you have a @State property with a default value that you then override in init, the compiler will surface an error. The fix is to remove the default value.

Unified resultBuilder for SwiftUI: instead of per-type @ViewBuilder, you can now mark vars and functions with @ContentBuilder. This lets the compiler eliminate unnecessary code paths, reducing type-checking timeout errors.

New agent skills for agentic coding workflows are also available via xcrun.

