SwiftUI navigationTransition Regression on iOS 26 (Source View Disappears + Flicker/Misaligned Geometry)

Summary

I’m experiencing two issues with SwiftUI’s navigationTransition(.zoom) on iOS 26.0 and 26.1 that break previously smooth transitions. These issues appear both on real devices and Simulator. The same code works correctly on iOS 18.

Issue 1 - Source View Disappears After Drag-Dismiss

When using .navigationTransition(.zoom(sourceID:..., in:...)), the source view disappears completely after the transition finishes. This only happens when the detail view is dismissed via drag (interactive dismiss). When the view is dismissed by tapping the back button, the source view remains visible as expected.

Reproduced on: iOS 26.0, iOS 26.0.1 (17A400), iOS 26.1 (Simulator + physical device)

Issue 2 — Flickering and Geometry Mismatch During Transition

Compared to iOS 18 behavior, the outgoing view and incoming view no longer share consistent geometry.

Current behavior on iOS 26:

  • The disappearing view flickers during the drag-dismiss interaction.
  • The source and destination views no longer align geometrically.
  • Instead of smoothly morphing as in previous iOS versions, the two views briefly overlap incorrectly before applying the zoom animation.

Expected (iOS 18) behavior:

  • Matched geometry between source and destination.
  • Smooth, stable zoom transition with no flickering.

//
//  ContentView.swift
//  DummyTransition
//
//  Created by Sasha Morozov on 12/11/25.
//

import SwiftUI

struct RectItem: Identifiable, Hashable {
    let id: UUID = UUID()
    let title: String
    let color: Color
}

struct ContentView: View {
    @Namespace private var zoomNamespace
    
    private let items: [RectItem] = [
        RectItem(title: "Red card",    color: .red),
        RectItem(title: "Blue card",   color: .blue),
        RectItem(title: "Green card",  color: .green),
        RectItem(title: "Orange card", color: .orange)
    ]
    
    var body: some View {
        NavigationStack {
            ScrollView {
                VStack(spacing: 16) {
                    ForEach(items) { item in
                        NavigationLink {
                            DetailView(item: item, namespace: zoomNamespace)
                                .navigationTransition(
                                    .zoom(sourceID: item.id, in: zoomNamespace)
                                )
                        } label: {
                            RoundedRectangle(cornerRadius: 16)
                                .fill(item.color.gradient)
                                .frame(height: 120)
                                .overlay(
                                    Text(item.title)
                                        .font(.headline)
                                        .foregroundStyle(.white)
                                )
                                .padding(.horizontal, 16)
                                .matchedTransitionSource(id: item.id, in: zoomNamespace)
                        }
                        .buttonStyle(.plain)
                    }
                }
                .padding(.vertical, 20)
            }
            .navigationTitle("Cards")
        }
    }
}

struct DetailView: View {
    let item: RectItem
    let namespace: Namespace.ID
    
    var body: some View {
        ZStack {
            item.color
            
            Text(item.title)
                .font(.largeTitle.bold())
                .foregroundStyle(.white)

        }
        .ignoresSafeArea()
        .navigationTitle("Detail")
        .navigationBarTitleDisplayMode(.inline)
    }
}

#Preview {
    ContentView()
}

Testing Environment

  • MacBook Pro (2023, M2 Pro, 16 GB RAM)
  • macOS 26.2 Beta (25C5031i)
  • Xcode: Version 26.0.1 (17A400)
  • Devices tested:
  • Simulator (iOS 26.0 / 26.1)
  • Physical device (iPhone 16) running iOS 26.1
SwiftUI navigationTransition Regression on iOS 26 (Source View Disappears + Flicker/Misaligned Geometry)
 
 
Q