Significant scrolling lag when using .focused modifier in large LazyVStack/LazyHStack on tvOS

Summary:

When using the new .focused modifier to track focus within a large LazyVStack or LazyHStack, we observe a major frame-rate drop and stuttering on Apple TV (1st and 2nd generation).

Steps to Reproduce:

  1. Create a LazyVStack (or LazyHStack) displaying a substantial list of data models (e.g., 100+ GroupData items).
  2. Attach the .focused(::) modifier to each row, binding to an @FocusState variable of the same model type.
  3. Build and run on an Apple TV device or simulator.
  4. Scroll through the list using the remote.
    static func == (lhs: GroupData, rhs: GroupData) -> Bool {
        lhs.id == rhs.id
    }
    
    var id: String
    var name: String
    var subName: String
    var subGroup: [GroupData] = []
    
    var logo: URL?
    
}

struct TestView: View {
    
    @FocusState var focusedGroup: GroupData?
    
    let groupsArr: [GroupData]
    
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(groupsArr, id: \.id) { group in
                    Button {
                        
                    } label: {
                        GroupTestView(group: group)
                    }
                    .id(group.id)
                    .focused($focusedGroup, equals: group)
                }
            }
        }
    }
    
}


struct GroupTestView: View {

    let group: GroupData
    
    var body: some View {
        HStack {
            KFImage.url(group.logo)
              .placeholder {
                Image(systemName: "photo")
                  .opacity(0.2)
                  .imageScale(.large)
              }
              .resizable()
              .scaledToFit()
              .frame(width: 70)
            
            VStack {
                Text(group.name)
                
                Text(group.subName)
            }
        }
    }
}

Expected Behavior

  • Scrolling remains smooth (60 fps) regardless of list size.
  • Focus updates without introducing visible lag.

Observed Behavior

  • Frame rate drops significantly when .focused is applied.
  • Scrolling becomes visibly laggy, especially on older Apple TV hardware.
  • Even when binding an @FocusState<String?> (storing only the id), performance improves slightly but remains suboptimal.

Workarounds Tried

  • Switched to @FocusState of type String to track only the ID of each group, this has helped but there is still a big performance decrease.
  • Minimised view-body complexity and removed other modifiers.
  • Verified that excluding .focused entirely restores smooth scrolling.

Any guidance or suggestions would be greatly appreciated.

Brainstorming: Try the workaround of factoring the body of the ForEach into its own view, with a boolean isFocused property, and .focused($isFocused)

Would love to get some feedback from any of the Apple engineers about it, the behavior is the same in tvOS26 Developer Beta 1 as well, having a LazyVStack with 700+ rows with each row using the .focused modifier will lag the ScrollView to almost 1 FPS when getting to position 500+-

It seems as SwiftUI keeps rendering all the previous scrolled rows which causes major lag.

Removing the .focused modifier completely fixes it, as this modifier is a key modifier for creating a complex apps in tvOS I would assume it would be a top priority to fix.

This behavior remind the same in tvOS 26 Developer Beta.

This really needs to be fixed as it makes complex app extremely hard to make for tvOS.

Significant scrolling lag when using .focused modifier in large LazyVStack/LazyHStack on tvOS
 
 
Q