Scrollview居中,第一次显示内容时会塞入内容[SwiftUI]

时间:2020-05-10 21:44:12

标签: ios swift swiftui

我已经构建了一个滚动视图,该滚动视图在API调用成功之后填充。我面临的问题是在第一次填充内容之后,所有列表都被塞满了屏幕的中心。只有在我关闭视图并重新打开视图之后,我才能在屏幕上看到正确适合的列表。我不知道,我试过没有运气的情况下重新调整框架。

事实上,当我导航离开并返回时,视图会自行纠正,这让我感到困惑,如果它保持相同的行为,那将很容易理解

  ScrollView(.vertical, showsIndicators: false){
            if(searchResultsViewModel.listings.count == 0){
                ActivityIndicator().foregroundColor(Color(hex:Global.colorAccent))
                                        .frame(width: 30, height: 30).padding(EdgeInsets(top: 15,leading: 0,bottom: 0,trailing: 0))

            }else {
            ForEach(self.searchResultsViewModel.listings, id: \.self){ item in
                           HStack(spacing: 0) {
                               ForEach(item, id: \.self) { listing in
                               NavigationLink(destination: ListingDetailsView(listing: listing)) {
                                   ListingView(listing: listing)
                                   }.buttonStyle(PlainButtonStyle())
                               }
                           }
                       }
            }
        }.navigationBarTitle(title)

下面是我要解释的图像

enter image description here

1 个答案:

答案 0 :(得分:1)

解决方案是强制重建滚动视图,因为原始文件不知道内容大小已更改。

因此,假设观察到self.searchResultsViewModel视图模型

@State private var scrollViewID = UUID()    // << initial

// ... other code

    ScrollView(.vertical, showsIndicators: false){

    // ... content here

    }.id(scrollViewID)                 // << dynamic id 
    .navigationBarTitle(title)
    .onReceive(self.searchResultsViewModel.$listings) { _ in
        self.scrollViewID = UUID()     // << force rebuild
    }