【问题标题】:ScrollView memory issue by adding .content - SwiftUiScrollView 内存问题通过添加.content - SwiftUi
【发布时间】:2022-12-12 22:25:07
【问题描述】:

为了用大量数据填充 ScrollView,苹果建议在 ScrollView 中使用 LazyVGrid:LazyVGrid - Apple

因此,这个加载 500 张随机照片的示例代码在内存管理的情况下完美运行:(将近 30MB)。

我使用 KingFisher 作为图像加载器。

var body: some View {
    ScrollView {
        LazyVGrid(columns: [GridItem(.flexible())]) {
            ForEach(1...500, id: \.self) { value in
                KFImage(URL(string: "https://picsum.photos/800/800?\(value)"))
            }
        }
    }
}

但是我想控制ScrollView的内容,比如offset。 所以一旦我添加.content.offset(y: 5),内存就会上升640MB!!

var body: some View {
    ScrollView {
        LazyVGrid(columns: [GridItem(.flexible())]) {
            ForEach(1...500, id: \.self) { value in
                KFImage(URL(string: "https://picsum.photos/800/800?\(value)"))
            }
        }
    }
    .content.offset(y: 5)
}

.content背后有什么原因吗?!!我该如何处理没有大量内存? 我需要手动禁用滚动和控制内容偏移,而不是使用ScrollViewReader

谢谢

【问题讨论】:

    标签: swift swiftui scrollview offset lazyvgrid


    【解决方案1】:

    您不应该在ScrollView 之外访问ScrollViewcontent。如果要修改内容,只需将修改添加到ScrollView的正文中即可。

    如果您在 ScrollView 之外访问 content,SwiftUI 必须计算 content 2x - 一次在 ScrollViewcontent 闭包内,当从 ScrollView 外部访问时再次计算。这也打破了延迟网格作为堆栈的延迟加载,因为布局系统无法检测视图的哪些部分当前可见,因此它必须将整个视图加载到内存中。

    var body: some View {
        ScrollView {
            LazyVGrid(columns: [GridItem(.flexible())]) {
                ForEach(1...500, id: .self) { value in
                    KFImage(URL(string: "https://picsum.photos/800/800?(value)"))
                }
            }
                .offset(y: 5)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 2020-02-22
      • 2021-01-23
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      相关资源
      最近更新 更多