Ios SwiftUI:在动态列表顶部添加视图会导致视图收缩

Ios SwiftUI:在动态列表顶部添加视图会导致视图收缩,ios,swift,swiftui,Ios,Swift,Swiftui,我有一个简单的SwiftUI列表,当我在列表顶部添加一个视图作为标题视图时,该列表异步显示来自合并发布者的数字,当数据从发布者返回时,内容视图被重新绘制时,标题会出现奇怪的收缩或闪烁: class ViewModel: ObservableObject { @Published var items: [Int] = [] var subscriptions = Set<AnyCancellable>() init() { (0...1

我有一个简单的
SwiftUI
列表,当我在列表顶部添加一个
视图作为标题视图时,该列表异步显示来自
合并
发布者的数字,当数据从发布者返回时,
内容视图
被重新绘制时,标题会出现奇怪的收缩或闪烁:

class ViewModel: ObservableObject {
    @Published var items: [Int] = []
    var subscriptions = Set<AnyCancellable>()

    init() {
            (0...10)
            .publisher
            .delay(for: .seconds(3), scheduler: DispatchQueue.main) //to simulate async call
            .sink { (value) in
            self.items.append(value)
        }
        .store(in: &subscriptions)
    }
}
以下是具有发布者的视图模型类:

class ViewModel: ObservableObject {
    @Published var items: [Int] = []
    var subscriptions = Set<AnyCancellable>()

    init() {
            (0...10)
            .publisher
            .delay(for: .seconds(3), scheduler: DispatchQueue.main) //to simulate async call
            .sink { (value) in
            self.items.append(value)
        }
        .store(in: &subscriptions)
    }
}
结果如下:

我试图将列表顶部的
VStack
分隔成一个外部
视图
,但没有改变


是什么导致了这种奇怪的收缩?有没有办法避免它?

修复方法是使用显式列表行插入,如下所示

List {
    VStack {
        Rectangle()
        Text("Some Text")
        Text("Some Other Very Long Text Some Other Some Other Long Text")
    }
    .background(Color.red)
    .listRowInsets(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10)

    ForEach(viewModel.items, id: \.self) {  item in
        Text("\(item)")
    }
    .listRowInsets(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10)
}

修复方法是使用显式列表行插入,如下所示

List {
    VStack {
        Rectangle()
        Text("Some Text")
        Text("Some Other Very Long Text Some Other Some Other Long Text")
    }
    .background(Color.red)
    .listRowInsets(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10)

    ForEach(viewModel.items, id: \.self) {  item in
        Text("\(item)")
    }
    .listRowInsets(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10)
}

这是一个很好的解决办法,你回答了问题的第一部分,但为什么会发生这种情况?这是SwiftUI中的一个大问题吗?@JAHelia,它看起来像一只虫子,但我不确定。你可以向苹果公司发送反馈,他们可以肯定地告诉你。嗯,对我来说似乎不起作用。我最终使用了TableViewController。这是一个很好的解决方法,您回答了问题的第一部分,但为什么会发生这种情况?这是SwiftUI中的一个大问题吗?@JAHelia,它看起来像一只虫子,但我不确定。你可以向苹果公司发送反馈,他们可以肯定地告诉你。嗯,对我来说似乎不起作用。我最终改用了TableViewController。