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

macOS中含多高度LazyVGrid的ScrollView使用.scrollPosition滚动异常求方案

macOS下ScrollView结合scrollPosition与高度不一致的LazyVGrid滚动异常问题

我在macOS系统中使用ScrollView,里面包含多个高度不一致的LazyVGrid,通过.scrollPosition()修饰符跟踪滚动位置。不启用该修饰符时滚动完全正常,但启用后出现滚动异常:当完全向下滚动列表后,无法再向上滚动。

这个问题和Stack Overflow上的类似问题情况相符,但我不能采用那个问题的解决方案——因为我的网格高度必须不同,强行统一会引发其他问题。

示例代码

struct ContentView: View {
    
    @State var scrollPosition: UUID? = nil
    
    struct MyStruct: Identifiable {
        let id = UUID()
        let text: String
        let uneven: Bool
    }
        
    @State var elements: [MyStruct]
    
    init() {
        var el = [MyStruct]()
        for i in 1..<30 {
            el.append(MyStruct(text: "Item\(i)", uneven: i % 2 == 0))
        }
        self.elements = el
    }
    
    var body: some View {
        
        VStack {
            ScrollView(.vertical) {
                LazyVStack {
                    ForEach(self.elements) { element in
                        VStack {
                            Text(element.text)
                            LazyVGrid(columns: Array(repeating: GridItem(.fixed(30)), count: 7), content: {
                                ForEach(0..<7 * (element.uneven == true ? 6 : 7), id: \.self) { index in
                                    Text("\(index)")
                                }
                            })
                            .padding(.bottom, 20)
                        }
                    }
                }   // end LazVStack
                .scrollTargetLayout()
                .frame(width: 600)
            }
            .scrollPosition(id: self.$scrollPosition)
        }
    }
}

问题细节

  • 移除.scrollPosition修饰符后,滚动恢复正常;
  • 如果把网格的ForEach改为ForEach(0..<7 * 7, id: \.self) { index in },让所有网格高度一致,滚动也能正常工作。

我尝试过添加假行解决,但会留下多余空间;添加负内边距或偏移量不仅没用,反而会再次触发问题。

我确定这是SwiftUI的bug,也会提交反馈,但考虑到Apple修复这类问题的概率较低,请问有没有可行的替代方案?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:23:14