@State private var visible: [Int] = [] var body: some View { ScrollView { LazyVStack identifiers } .onChange(of: visible) { print(visible) } }}如上例所示,我们在懒加载栈(LazyVStack @State private var visible: [Int] = [] var body: some View { ScrollView { LazyVStack ContentViewScrollView 和 LazyVStack:使用 ScrollView 包裹一个 LazyVStack,在其中放置 1 到 99 的数字。 scrollTargetLayout:在 LazyVStack 上应用 scrollTargetLayout 视图修饰符,以允许 ScrollView 针对栈的子视图进行目标识别。
比如在 List 和 LazyVStack 中,Cell 视图在创建之后即使滚动出屏幕不参与布局与渲染,但 SwiftUI 仍会保留这些视图的数据,直到 List 或 LazyVStack 被销毁。 视图进入屏幕后触发 onAppear,滚动出屏幕后会触发 onDisappear,在 Cell 视图的存续期内可以多次触发 onAppear 和 onDisappear ScrollView { LazyVStack •在 List 和 LazyVStack 中,SwiftUI 出于效率的考虑,即使 Cell 视图移出显示范围,它的视图仍将保留在视图值树上(视图仍将存续)。 另外,由于 List 和 LazyVStack 的布局逻辑不同(List 的容器高度是固定的,LazyVStack 的容器高度是不固定的,向下预估的),两者触发 onDisappear 的时机点也不同。 List 是上下两侧都会触发,LazyVStack 只有下方会触发。
image-20230321203001315 假如,我们将 VStack 换成 List 或 LazyVStack 呢? List { // LazyVStack 或其他惰性容器 var offset = 0 ForEach(items) { item in // 判断当前是否为首个数据 List { // 或 LazyVStack var offset = 0 ForEach(items) { item in // 判断当前是否为首个数据
有得必有失 —— NavigationSplitView + LazyVStack尽管 List 使用起来很简单,但也有一些不足之处,其中最重要的是无法自定义选中的状态。 那么能否在导航列中使用 VStack 或 LazyVStack 实现程序化导航呢? NavigationSplitView(columnVisibility: $visible, sidebar: { ScrollView { LazyVStack @ObservedObject var store: AdaptiveStore var body: some View { ScrollView { LazyVStack
var body: some View { ScrollView { LazyVStack { ForEach(0..<100) { index var body: some View { VStack { ScrollView { LazyVStack {
@State private var isEnabled = true ScrollView { LazyVStack { ForEach(items) { item in LazyVStack { ForEach(items) { item in CellView(width: 200, height: 140) .idView Toggle("Layout enable", isOn: $isEnabled).padding() ScrollView { LazyVStack
@State private var visible: [Int] = [] var body: some View { ScrollView { LazyVStack
目前,我总是去找 LazyVStack 来代替。A:有多种修饰器可以实现这个功能:listRowSeparator, listRowInsets。不支持整个列表填充,请对此提出反馈。 这意味着我们不能使用 LazyVStack,或任何其他将选择与详细视图绑定的自定义视图。有扩展这个功能的计划吗?A:在 iOS 16.1 中,你可以在侧边栏里放一个。 NavigationSplitView { LazyVStack { NavigationLink("link", value: 213) } .navigationDestination
可通过 LazyVStack / LazyHStack 实现视图的按需加载,配合 onAppear 修饰符在视图即将显示时才加载数据。
巧用视图复用,提升 SwiftUI 滚动列表性能 [8] SwiftUI 提供了List、LazyVStack等惰性容器,但在处理大规模数据时,这些组件的性能仍然存在局限性。
https://twitter.com/fatbobman "Fatbobman( 东坡肘子 "Fatbobman( 东坡肘子)")") 在 SwiftUI 的框架中,惰性布局容器,如 List 和 LazyVStack
对于 List、ScrollView + LazyVStack( LazyHStack )这类的组合,需要为每个子视图都添加一个 scrollSensor。
对于非惰性视图(如 LazyVStack ),一旦 hosting controller 的视图被初始化,onAppear 将被调用。
请注意至少到现在,布局协议不能创建懒加载容器,比如 LazyHStack 或 LazyVStack。懒加载容器是指那些只在滚入屏幕时渲染,滚出到屏幕外就停止渲染的视图。