SwiftUI LazyContainer

在 SwiftUI ScrollView 中实现延迟渲染和布局。

对于现有的 SwiftUI 布局,可以考虑使用 SwiftUIOnVisible,以便在子视图于 ScrollView 中变得可见时获得回调。

开始使用

使用 lazyContainer 来配置 ScrollView 以进行延迟渲染。

使用 AltLazyVStack 作为 VStackLazyVStack 的替代品,以便仅在其内容在 ScrollView 中可见时才进行渲染。

ScrollView {
    AltLazyVStack(data, contentHeight: 200) { element in
        /// Lazy content
    }
}
.lazyContainer()

使用 LazyVMasonry 以垂直瀑布流的方式排列子视图,并进行延迟渲染。

ScrollView {
    LazyVMasonry(data, columns: 2, contentHeights: [.fraction(1/4), .fraction(1/5)]) { element in
        /// Lazy content
    }
}
.lazyContainer(renderingPadding: 16, rendersInSafeAreaEdges: .all)

高级用法

使用 templatelazySubviewTemplate 来提供隐藏的模板视图,用于调整延迟子视图的大小。

ScrollView {
    VStack {
        AltLazyVStack(data, contentHeight: .template) { element in
            /// Lazy content
        }
    }
}
.lazyContainer {
    VStack {
        Text(verbatim: "Placeholder")
            .font(.headline)
        
        Text(verbatim: "Placeholder")
            .font(.subheadline)
    }
    .padding()
    .lineLimit(1)
    .lazySubviewTemplate()
}

使用 contentHeight 闭包来解析每个元素的子视图高度。将 LazySubviewSize 值与 +sum 结合使用,以动态构建子视图高度。

ScrollView {
    LazyVMasonry(data, columns: .adaptive(minSize: 140), spacing: 8) { element in
        /// Lazy content
    } contentHeight: { element in
        let imageHeight = LazySubviewSize.aspect(element.imageSize.width / element.imageSize.height)
        let titleHeight = LazySubviewSize.template(id: element.subtitle == nil ? 1 : 2)
        return imageHeight + titleHeight
    }
}
.lazyContainer {
    Text(verbatim: "Title Placeholder")
        .font(.headline)
        .padding()
        .lineLimit(1)
        .lazySubviewTemplate(id: 1)
    
    VStack {
        Text(verbatim: "Title Placeholder")
            .font(.headline)
        
        Text(verbatim: "Subtitle Placeholder")
            .font(.subheadline)
    }
    .padding()
    .lineLimit(1)
    .lazySubviewTemplate(id: 2)
}

请参阅 示例 了解更多信息。

要求

安装

联系方式

在 Twitter 上 @ciaranrobrien