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
相关产品推荐
相关产品推荐

