在 SwiftUI ScrollView 中实现延迟渲染和布局。
对于现有的 SwiftUI 布局,可以考虑使用 SwiftUIOnVisible,以便在子视图于 ScrollView 中变得可见时获得回调。
使用 lazyContainer
来配置 ScrollView 以进行延迟渲染。
使用 AltLazyVStack
作为 VStack
或 LazyVStack
的替代品,以便仅在其内容在 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)
使用 template
和 lazySubviewTemplate
来提供隐藏的模板视图,用于调整延迟子视图的大小。
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)
}
请参阅 示例 了解更多信息。
SwiftUILazyContainer
以开始使用。在 Twitter 上 @ciaranrobrien。