我正在创建一个水平菜单,并使用水平ScrollView
和HStack
来查看其项目.一切似乎都很好用,但我对ScrollViewReader
有点问题.正如您应该从代码中看到的那样,当currentIndex
更改时,我将其值传递给proxy.scrollTo()
方法,但我没有得到任何结果,ScrollView
没有遵循currentIndex
的修改,而currentIndex
仍然保持在其原始位置.你能告诉我我哪里错了吗?谢谢你们所有人
struct ScrollableTabMenu<T:CaseIterable & Hashable & Identifiable>: View {
var items: [T]
var title: KeyPath<T, String>
@Binding var currentIndex: Int
@Namespace private var animation
var body: some View {
ScrollView(.horizontal) {
ScrollViewReader { proxy in
HStack {
ForEach(items) { screen in
let index = items.firstIndex(of: screen)!
Button {
currentIndex = index
} label: {
Text(screen[keyPath: title])
.padding()
.overlay(alignment: .bottom){
if currentIndex == index {
RoundedRectangle(cornerRadius: 6)
.frame(height: 1)
.matchedGeometryEffect(id: "AninamtionTAB", in: animation)
}
}
}
.buttonStyle(.plain)
}
}
.onChange(of: currentIndex, { _, newValue in
withAnimation {
proxy.scrollTo(newValue, anchor: .leading)
print(newValue)
}
})
}
}
.scrollTargetBehavior(.paging)
.scrollIndicators(.hidden)
.contentMargins(.horizontal, 16)
}
}