我一直在努力解决这个问题GeometryReader
,.onChange(of: geo.frame(in: .global).minY)
但一直没有取得很大成功。考虑以下几点:
struct TestScreen: View {
var body: some View {
NavigationStack {
ScrollView {
VStack {
Text("View A")
.frame(height: 50)
.frame(maxWidth: .infinity)
.background(.green)
Text("View B - Sticky")
.frame(height: 50)
.frame(maxWidth: .infinity)
.background(.blue)
ForEach(0..<15) { i in
Text("View \(i)")
.frame(height: 50)
.frame(maxWidth: .infinity)
.background(Color.red)
}
}
}
.navigationBarTitleDisplayMode(.inline)
.toolbarBackground(.clear, for: .navigationBar)
.toolbar {
ToolbarItem(placement: .principal) {
Text("Testing")
.foregroundColor(.purple)
}
}
}
}
}
目标是让视图 B 在向上滚动视图时固定在顶部(导航栏下方),当然,在向下滚动时,它会占据滚动视图中的正常位置。我知道您可以使用和来实现粘性标题,List
但这Sections
不符合我的需要,因为请注意,视图 B(粘性视图)不一定是滚动视图中的第一个项目。
还要注意,视图 B 必须位于 VStack 中所有其他内容的顶部,以便其他内容在其下方滚动。
尝试使用
LazyVStack
带有部分和固定标题的:ForEach
作为其主要内容和视图 B 作为其标题。