如何在SwiftUI中进行类似Apple Music的导航?自定义列表和NavigationView突出显示了不会消失

时间:2020-05-10 15:45:44

标签: swiftui swiftui-list swiftui-navigationlink

这是我要开始工作的示例:

struct ContentView: View {
    let links = ["Item 1", "Item 2", "Item 3", "Item 4"]

    var body: some View {
        NavigationView {
            ScrollView {
                Text("My Title")
                List(links, id: \.self) {
                    link in
                    NavigationLink(destination: TestView()) {
                        Text(link)
                            .padding(.vertical, 4)
                            .frame(maxWidth: .infinity, alignment: .leading)
                    }
                }
                .frame(height: 178)
                Text("Some more content here")
            }
        }
    }
}

注意:TestView只是带有文本问候世界的某些视图。

我正在尝试复制Apple Music的导航样式。我尝试将Button放在NavigationLink中,但是在文本上点击它不会改变视图,并且我无法找到一种方法来同时可靠地更改行的颜色时间。同样以某种方式,我设法使其起作用,但是颜色的动画方式不同,即,颜色从A渐变到B,经过约100ms,而我试图实现的是立即在状态之间进行动画(例如苹果音乐)。

我目前的方法是使用List,将NavigationLinks放入其中,然后通过赋予高度来切断整个视图。这样,我可以将其与其他内容放在一起。

它现在可以正常工作,但是每当我单击一行并返回时,该行仍会突出显示,而不应该显示。有没有一种方法可以使它以某种方式退回到屏幕时取消选择?

我认为此错误是由List内的ScrollView引起的,因为当我删除ScrollView时,列表正常工作,并且没有此高亮错误。但是我需要能够将内容与列表放在一起,并且我不希望列表占据整个屏幕。

有什么办法可以用这种方法来修复这个错误吗?我也愿意采用其他方法,而无需使用List

1 个答案:

答案 0 :(得分:0)

尝试使用ForEach而非List吗? 通过查看行(CustomRow),您可以在其中传递 link 项目并设置自定义分隔线,背景等...

ForEach(links, id: \.self) { link in
    NavigationLink(destination: TestView()) {
       CustomRow(item: link)
    }
  }
.frame(height: 178)