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

问题描述

我正在尝试这样做:

  • 一个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()
    }
}

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

干杯,
–巴格兰

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)