Ios 在列表顶部插入项目时,如何在LazyVStack/VStack中保持滚动位置

Ios 在列表顶部插入项目时,如何在LazyVStack/VStack中保持滚动位置,ios,swift,swiftui,Ios,Swift,Swiftui,我创建了一个简单的垂直列表,其中包含要显示的项目 问题是当我通过insertAtTop()在列表顶部插入项目时。滚动视图不会停留在同一位置 请看视频: 如何使滚动视图保持在相同的位置 下面是示例代码 struct TestView: View { @State private var items: [Item] = [] var body: some View { NavigationView { ScrollView

我创建了一个简单的垂直列表,其中包含要显示的项目

问题是当我通过
insertAtTop()
在列表顶部插入项目时。滚动视图不会停留在同一位置

请看视频:


如何使滚动视图保持在相同的位置

下面是示例代码

struct TestView: View {
    
    @State private var items: [Item] = []
    
    var body: some View {
        NavigationView {
            ScrollView {
                LazyVStack {
                    ForEach(items, id: \._id) { item in
                        Text(item.text)
                            .background(Color.green)
                            .padding(.bottom, 10)
                    }
                }
            }
            .navigationBarItems(trailing: HStack {
                Button("[Insert at top]", action: {
                    insertAtTop()
                })
                Spacer(minLength: 20)
                Button("[Load]", action: {
                    load()
                })
            })
            .navigationTitle("Item List")
        }
    }
    
    private func load() {
        items = (1...50).map { _ in Item() }
    }
    
    private func insertAtTop() {
        let newItems = (1...20).map { _ in Item() }
        items.insert(contentsOf: newItems, at: 0)
    }
    
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        TestView()
    }
}

struct Item {
    var _id = UUID()
    var text = UUID().uuidString.prefix(5)
}

事实上,它保持了滚动位置,但改变了内容,正如我假设的,你想改变滚动位置以保留以前可见的内容。是的,这就是我想要解决的问题。正如您所提到的,滚动偏移量实际上没有改变,但内容大小已经改变。我可以用UITableView解决这个问题,方法是在重新加载数据后设置偏移量。你在@nRewik找到这个问题了吗?我在这里遇到了类似的问题: