如何使用tvOS上的SwiftUI在多个水平列表之间导航

如何使用tvOS上的SwiftUI在多个水平列表之间导航,swiftui,tvos,Swiftui,Tvos,我在一个全局垂直列表中有多个可滚动的水平列表,我很难管理焦点的变化 我有两个主要问题: 当一个视图下面没有其他视图时,底部手势不更新焦点。我想把焦点移到下面的视图。在我的GIF示例中,从第1节的第四视图到第2节的第二视图 当一个视图没有正下方的另一个视图时,底部手势将焦点移动到垂直下方的视图。我希望焦点移到最近的底部视图。在我的示例中,从第1节第三视图到第2节第二视图,而不是第3节第三视图 在我的tvOS应用程序中,我有很多关于这个问题的例子,我通过使用@Environment(\.r

我在一个全局垂直列表中有多个可滚动的水平列表,我很难管理焦点的变化

我有两个主要问题:

  • 当一个视图下面没有其他视图时,底部手势不更新焦点。我想把焦点移到下面的视图。在我的GIF示例中,从第1节的第四视图到第2节的第二视图

  • 当一个视图没有正下方的另一个视图时,底部手势将焦点移动到垂直下方的视图。我希望焦点移到最近的底部视图。在我的示例中,从第1节第三视图到第2节第二视图,而不是第3节第三视图

在我的tvOS应用程序中,我有很多关于这个问题的例子,我通过使用
@Environment(\.resetFocus)var resetFocus
prefersDefaultFocus
viewModifier的组合修复了这个问题,但我正在努力解决这个用例

我还看到了另一个类似的用例,但还没有答案

struct ContentView: View {
    var body: some View {
        VStack(alignment: .leading) {

            Text("Section 1")

            ScrollView(.horizontal) {
                HStack() {
                    ForEach(0 ..< 10) { item in
                        Button(action: {
                            
                        }) {
                            FocusableRectangle()
                        }.buttonStyle(CardButtonStyle())
                    }
                }.padding(40)
            }
            
            Text("Section 2")

            ScrollView(.horizontal) {
                HStack() {
                    ForEach(0 ..< 2) { item in
                        Button(action: {
                            
                        }) {
                            FocusableRectangle()
                        }.buttonStyle(CardButtonStyle())
                    }
                }.padding(40)
            }
            
            Text("Section 3")

            ScrollView(.horizontal) {
                HStack() {
                    ForEach(0 ..< 3) { item in
                        Button(action: {
                            
                        }) {
                            FocusableRectangle()
                        }.buttonStyle(CardButtonStyle())
                    }
                }.padding(40)
            }
            
            Spacer()
        }
    }
}

struct FocusableRectangle: View {
    @Environment(\.isFocused) var isFocused: Bool
    @State var color = Color.blue
    
    var body: some View {
        Rectangle()
            .fill(color)
            .frame(width: 300.0, height: 200.0)
            .onChange(of: isFocused, perform: { value in
                color = value ? Color.red : Color.blue
            })
    }
}
struct ContentView:View{
var body:一些观点{
VStack(对齐:。前导){
案文(“第1节”)
滚动视图(.horizontal){
HStack(){
ForEach(0..<10){
按钮(操作:{
}) {
FocusableRectangle()
}.buttonStyle(CardButtonStyle())
}
}.填充(40)
}
案文(“第2节”)
滚动视图(.horizontal){
HStack(){
ForEach(0..<2){中的项目
按钮(操作:{
}) {
FocusableRectangle()
}.buttonStyle(CardButtonStyle())
}
}.填充(40)
}
案文(“第3节”)
滚动视图(.horizontal){
HStack(){
ForEach(0..<3){中的项目
按钮(操作:{
}) {
FocusableRectangle()
}.buttonStyle(CardButtonStyle())
}
}.填充(40)
}
垫片()
}
}
}
结构FocusableRectangle:视图{
@环境(\.isFocused)变量isFocused:Bool
@状态变量color=color.blue
var body:一些观点{
矩形()
.填充(颜色)
.框架(宽度:300.0,高度:200.0)
.onChange(of:isFocused,执行:{value in
颜色=值?颜色。红色:颜色。蓝色
})
}
}