Application Hangs with Nested LazyVStack When Accessibility Inspector is Active

Description

I've encountered a consistent hang/freeze issue in SwiftUI applications when using nested LazyVStack containers with Accessibility Inspector (simulator) or VoiceOver (physical device) enabled. The application becomes completely unresponsive and must be force-quit.

Importantly, this hang occurs in a minimal SwiftUI project with no third-party dependencies, suggesting this is a framework-level issue with the interaction between SwiftUI's lazy view lifecycle and the accessibility system.

Reproduction Steps

I've created a minimal reproduction project available here: https://github.com/pendo-io/SwiftUI_Hang_Reproduction

To Reproduce:

  1. Create a SwiftUI view with the following nested LazyVStack structure:
struct NestedLazyVStackView: View {
    @State private var outerSections: [Int] = []
    @State private var innerRows: [Int: [Int]] = [:]
    
    var body: some View {
        ScrollView {
            LazyVStack(alignment: .leading, spacing: 24) {
                ForEach(outerSections, id: \.self) { section in
                    VStack(alignment: .leading, spacing: 8) {
                        Text("Section #\(section)")
                        
                        // Nested LazyVStack
                        LazyVStack(alignment: .leading, spacing: 2) {
                            ForEach(innerRows[section] ?? [], id: \.self) { row in
                                Text("Section #\(section) - Row #\(row)")
                                    .onAppear {
                                        // Load more data when row appears
                                        loadMoreInner(section: section)
                                    }
                            }
                        }
                    }
                    .onAppear {
                        // Load more sections when section appears
                        loadMoreOuter()
                    }
                }
            }
        }
    }
}
  1. Enable Accessibility Inspector in iOS Simulator:

    • Xcode → Open Developer Tool → Accessibility Inspector
    • Select your running simulator
    • Enable Inspection mode (eye icon)
  2. Navigate to the view and start scrolling

  3. Result: The application hangs and becomes unresponsive within a few seconds of scrolling

Expected Behavior

The application should remain responsive when Accessibility Inspector or VoiceOver is enabled, allowing users to scroll through nested lazy containers without freezing.

Actual Behavior

  • The application freezes/hangs completely
  • CPU usage may spike
  • The app must be force-quit to recover
  • The hang occurs consistently and is reproducible

Workaround 1: Replace inner LazyVStack with VStack

LazyVStack {
    ForEach(...) { section in
        VStack {  // ← Changed from LazyVStack
            ForEach(...) { row in
                ...
            }
        }
    }
}

Workaround 2: Embed in TabView

TabView {
    NavigationStack {
        NestedLazyVStackView()  // ← Same nested structure, but no hang
    }
    .tabItem { ... }
}

Interestingly, wrapping the entire navigation stack in a TabView prevents the hang entirely, even with the nested LazyVStack structure intact.

Questions for Apple

  1. Is there a known issue with nested LazyVStack containers and accessibility traversal?
  2. Why does wrapping the view in a TabView prevent the hang?
  3. Are there recommended patterns for using nested lazy containers with accessibility support?
  4. Is this a timing issue, a deadlock, or an infinite loop in the accessibility system?
  5. Why that happens?

Reproduction Project

A complete, minimal reproduction project is available at: https://github.com/pendo-io/SwiftUI_Hang_Reproduction

Application Hangs with Nested LazyVStack When Accessibility Inspector is Active
 
 
Q