ScrollView 中的 GeometryReader - 滚动不再起作用

时间:2021-01-02 11:15:09

标签: swiftui geometryreader lazyvstack

我试图通过将 GeometryReader 放置在 ScrollView 中来获得滚动偏移,但它禁用了滚动(LazyVStack 的区域在尝试滚动时反弹)。看起来 GeometryReader 的大小与 LazyVStack 完全相同,而 LazyVStack 的高度为 .infinite,因此滚动不起作用。

我尝试在 ScrollView 周围放置 GeometryReader 并且滚动效果很好,但我没有从 onPreferenceChange 收到任何数据。是否有任何解决方法可以使它们(滚动和 onPreferenceChange 报告)工作?

enter image description here

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        VStack {
            ScrollView {
                GeometryReader { insideProxy in
                    LazyVStack(spacing: 0) {
                        ForEach(0...100, id:\.self) { val in
                            ZStack {
                                Text("test")
                                    .font(.system(size: 128))
                                
                            } // ZStack
                            .background(Color.blue)
                        } // ForEach
                        .background(Color.yellow)
                    }.preference(
                        key: OffsetPreferenceKey.self,
                        value: insideProxy.frame(in: .global).minY
                    )
                    .background(Color.red)
                }
            }
            .padding(.top, 40)
        }
        .onPreferenceChange(OffsetPreferenceKey.self) { newValue in
            print("The new value is: \(newValue)")
        }
        
        
    }
}


private struct OffsetPreferenceKey: PreferenceKey {
    static var defaultValue: CGFloat = .zero
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {}
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

0 个答案:

没有答案
相关问题