在我的iOS应用程序(使用SwiftUI(中,我使用的是垂直滚动的滚动视图。我的问题是:我只想从上到下滚动,而不是从下到上滚动。
这可能吗?
谢谢。
使用LazyVGrid和拖动手势更改后,只允许滚动到底部。
struct ContentView: View {
@State private var offset: CGFloat = .zero
var columns: [GridItem] = Array(repeating: .init(.flexible()), count: 2)
var body: some View {
LazyVGrid(columns: columns) {
ForEach((0...79), id: .self) {
let codepoint = $0 + 0x1f600
let codepointString = String(format: "%02X", codepoint)
Text("(codepointString)")
let emoji = String(Character(UnicodeScalar(codepoint)!))
Text("(emoji)")
}
}
.font(.largeTitle)
.offset(y: offset)
.gesture(DragGesture().onChanged {value in
let translation = value.translation.height
if translation < 1 {
offset = translation
}
})
}
}
更新
滚动时需要跟踪最后一个偏移,每次停止滚动时将其重置为零。这修复了您在评论中提到的问题。
struct ContentView: View {
@State private var offset: CGFloat = .zero
@State private var lastOffset: CGFloat = .zero
var columns: [GridItem] = Array(repeating: .init(.flexible()), count: 2)
var body: some View {
LazyVGrid(columns: columns) {
ForEach((0...79), id: .self) {
let codepoint = $0 + 0x1f600
let codepointString = String(format: "%02X", codepoint)
Text("(codepointString)")
let emoji = String(Character(UnicodeScalar(codepoint)!))
Text("(emoji)")
}
}
.font(.largeTitle)
.offset(y: offset)
.gesture(DragGesture().onChanged {value in
let translation = value.translation.height
if translation <= lastOffset {
offset = translation
lastOffset = translation
}
}.onEnded { value in
lastOffset = .zero
})
}
}
如果视图不太多,则不需要使用LazyVGrid
。