尝试分页时,进度视图不会在第二次加载时显示。当我滚动到底部时,进度视图将出现一次。但其他时候则不然。这似乎只在我使用某种动画时才会发生。
如果我只有一个像“正在加载...”这样的静态文本,它就会按预期工作。我添加了一个部分组,它在其中检查条件以验证是否应该显示它。不确定我是否应该使用像 UIKit 中的加载指示器那样的“停止动画”之类的东西
struct ContentView: View {
@State var movies: [Movie] = []
@State var currentPage = 1
@State private var isLoading = false
var body: some View {
NavigationView {
List {
Section {
} header: {
Text("Top Movies")
}
ForEach(movies) { movie in
HStack(spacing: 8) {
AsyncImage(url: movie.posterURL, scale: 5) { image in
image
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 100)
.cornerRadius(10)
} placeholder: {
ProgressView()
.frame(width: 100)
}
VStack(alignment: .leading, spacing: 10) {
Text(movie.title)
.font(.headline)
Text(movie.overview)
.lineLimit(5)
.font(.subheadline) …Run Code Online (Sandbox Code Playgroud) 因此,过去我一直使用滚动视图跟踪滚动位置,但我陷入了需要使用列表跟踪位置的情况。我使用列表是因为我想要一些内置的空间来创建我的视图,例如默认的列表样式。
我可以使用 PreferenceKeys 获取该值,但问题是当我向上滚动到远处时,PreferenceKey 值将默认返回到其位置 0,从而破坏了我的 show shy 标题视图逻辑。
这是TrackableListView代码
struct TrackableListView<Content: View>: View {
let offsetChanged: (CGPoint) -> Void
let content: Content
init(offsetChanged: @escaping (CGPoint) -> Void = { _ in }, @ViewBuilder content: () -> Content) {
self.offsetChanged = offsetChanged
self.content = content()
}
var body: some View {
List {
GeometryReader { geometry in
Color.clear.preference(key: ScrollOffsetPreferenceKey.self, value: geometry.frame(in: .named("ListView")).origin)
}
.frame(width: 0, height: 0)
content
.offset(y: -10)
}
.coordinateSpace(name: "ListView")
.onPreferenceChange(ScrollOffsetPreferenceKey.self, perform: offsetChanged)
}
} …Run Code Online (Sandbox Code Playgroud)