You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI技术问题:LazyVStack加载元素数量超出可视范围预期

关于LazyVStack预加载行数与教程不一致的问题

我之前也碰到过类似的版本差异问题,这大概率不是Xcode/iOS的bug,而是Apple在不同系统版本中调整了LazyVStack的预加载策略。

为什么会出现83条日志而不是42条?

LazyVStack的“懒加载”并不是只加载当前可视区域的内容——为了让滚动更流畅,系统会预加载可视区域外的一部分内容(相当于提前缓存),避免滚动时出现空白或卡顿。这个预加载的内容数量,在不同iOS版本里的实现逻辑是有区别的:

  • 你使用的是iOS 15.2,这个版本的LazyVStack预加载的额外内容更多,所以总加载行数(可视42 + 预加载41)达到了83;
  • 教程里使用的应该是更新的iOS版本(比如iOS 15后期或iOS 16+),Apple优化了预加载策略,减少了预加载的数量,所以只加载了可视范围内的42行。

验证懒加载是否正常工作的小技巧

即使预加载数量和教程不同,你可以通过以下方式确认LazyVStack的懒加载逻辑是正常的:

  • 缓慢滚动列表,观察控制台会打印新的行日志(而不是一次性打印1000条),说明确实是按需加载;
  • 修改SampleRow的高度,比如添加一个固定高度:
    Text("Row \(id)")
        .frame(height: 100)
    
    此时可视行数会减少,预加载的总行数也会相应变化,能直观看到预加载的比例。

你的测试代码

import SwiftUI
struct SampleRow: View {
    let id: Int
    var body: some View {
        Text("Row \(id)")
    }
    init(id: Int) {
        print("Loading row \(id)")
        self.id = id
    }
}
struct ContentView: View {
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(1...1000, id: \.self, content: SampleRow.init)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者GVG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:42:42