0

我有一个问题困扰了我好几天,所以就在这里。

我在顶部有一个可水平滚动的“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)
        }
    }
}
4

0 回答 0