0

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

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

在此处输入图像描述

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()
    }
}
4

0 回答 0