XCode 版本 12.4 (12D4e)
每次我在 ScrollView 中实现 Lazy 堆栈时都会遇到这种情况:
- 将 a 添加
LazyHStack
到水平ScrollView
或将 a添加LazyVStack
到垂直ScrollView
- 添加足够的内容以使滚动视图的内容大小超出其范围
场景 1 - 将滚动视图拉出边界(就好像你在拉动刷新一样)
预期的行为:它的行为与预期的滚动视图保持在您的手指下一样
观察到的行为:口吃和跳跃
场景 2 - 快速滚动到边缘,使其必须反弹
预期行为:它平稳地弹跳
观察到的行为:当它到达边缘时它会停止并抖动,但不会反弹
我的理论 我的理论是,由于使用了惰性堆栈,当视图离开屏幕时,它会从视图层次结构中删除,从而产生口吃。
我想知道是否有其他人遇到过这种情况?这是 SwiftUI 中的错误吗?几个月来,我已经在不同的项目中可靠地复制了这一点,最终不使用我希望可以的 Lazy 堆栈。
示例代码
ScrollView {
LazyVStack {
ForEach(viewModel.items) { items in
SomeView(viewModel: .init(context: viewModel.context, item: item))
}
}
注意:口吃只发生在滚动视图的顶部
** 2021 年 7 月 10 日更新**
这仍然在 iOS 15 版本 13.0 beta (13A5155e) 中发生。
在下面的视频中,请注意滚动条的行为和我们到达底部时的卡顿:
** 2021 年 7 月 19 日更新**
我把视图中的所有东西都撕掉并一个一个地构建起来——只要我VStack/HStack/ZStack
在一个简单的Text
元素周围放置一个,LazyVStack 就会开始卡顿。
如果我添加fixedSize(horizontal: false, vertical: true)
到Text
元素中,它似乎停止了口吃。一旦我添加一个UIViewRepresentable
可变高度,它就会再次开始口吃。
似乎在 LazyStack 中,每个孩子都需要某种固定大小或纯粹的 SwiftUI 视图才能工作。
我会继续挖掘。必须...解决...