在SwiftUI中读取ScrollView内容偏移的更好方法

时间:2020-09-27 10:29:40

标签: ios swiftui scrollview offset

我正在尝试这样做:

  • 有一个ScrollView,它的顶部包含另一个视图,下面可能包含其他视图;
  • 当用户将ScrollView向下拉到顶部边缘之外时,我希望该元素保持“粘合”到ScrollView的顶部边缘;
  • 否则,它应该正常滚动。

我现在对SwiftUI足够精通,因此可以实现这种行为:

import SwiftUI

struct ContentView: View {
    @State private var topOffset: CGFloat = 0
    
    struct TopOffsetKey: PreferenceKey {
        typealias Value = CGFloat

        static var defaultValue: Value = 0

        static func reduce(
            value: inout Value,
            nextValue: () -> Value
        ) {
            value = nextValue()
        }
    }
    
    var body: some View {
    
        ScrollView {
            
            VStack {
                
                Rectangle()
                    .fill(Color.red)
                    .aspectRatio(1, contentMode: .fill)
                    .offset(y: topOffset > 0 ? -topOffset : 0)
                    .background(
                        GeometryReader { g in
                            Color.clear
                                .preference(key: TopOffsetKey.self, value: g.frame(in: .named("ScrollView")).origin.y)
                        }
                    )
                
                ForEach(0..<10) { _ in
                    Rectangle()
                        .fill(Color.gray)
                        .frame(height: 100)
                }
                
            }
            
        }
        .coordinateSpace(name: "ScrollView")
        .onPreferenceChange(TopOffsetKey.self) {
            topOffset = $0
        }
        
    }
}


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

该代码可以正常工作,但是感觉很脏,我对高手的问题是:“有没有更好的方法?”

干杯,
–巴格兰

0 个答案:

没有答案