我正在尝试这样做:
我现在对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()
}
}
该代码可以正常工作,但是感觉很脏,我对高手的问题是:“有没有更好的方法?”
干杯,
–巴格兰