我有一个问题困扰了我好几天,所以就在这里。
我在顶部有一个可水平滚动的“headerView”,在带有项目的滚动视图下方,可垂直滚动。
HeaderView 有最小和最大高度,假设 100 是最小值,200 是最大值。
当用户滚动底部scrollview时,首先header需要缩小高度(在max和min之间),然后scrollview才能滚动自己,但top需要满足headerView的底部——它不能滚动到header view上。为了让事情更容易理解,我有截图(首先你可以看到实际的屏幕,然后你可以看到第一个间隔项目(红色))。可以在附加的视频中看到预期的行为。
我唯一的问题是标题上的按钮不可点击,headerView 也不能左右滚动。
视频可以在这里找到:https ://streamable.com/6czr2q
var body: some View {
GeometryReader { screenGeometry in
ZStack {
Color.black
ScrollView(.horizontal) {
CatalogPreviewPageView()
.frame(width: screenGeometry.size.width, height: currentOffset /*maxOffset*/)
Spacer()
}
ScrollView(.vertical, showsIndicators: false) {
LazyVStack(alignment: .leading, spacing: 0) {
Spacer()
.background(Color.clear)
.frame(height: maxOffset - minOffset - scrollViewOverlappingOffset)
Text("Exposed Promotions")
.foregroundColor(Color.black)
.padding()
.frame(maxWidth: screenGeometry.size.width)
.background(Color.gray)
.cornerRadius(20, corners: [.topLeft, .topRight])
ForEach(0...50, id: \.self) { index in
HStack(spacing: 0) {
Color.white
Text("Row \(index)")
.foregroundColor(Color.black)
.onTapGesture {
print("Clicked row: \(index)")
}
.padding(16)
.background(Color.white)
Color.white
}
}
}
.background(
GeometryReader {
Color.clear.preference(key: ScrollViewOffsetKey.self,
value: $0.frame(in: .named(Self.scrollCoordinateSpace)).origin.y)
}
)
.onPreferenceChange(ScrollViewOffsetKey.self) { verticalChange in
DispatchQueue.main.async {
update(verticalChange: verticalChange, safeAreaTopInset: screenGeometry.safeAreaInsets.top)
}
}
}
.padding(.top, minOffset)
}
}
}