XCode 版本 12.4 (12D4e)
每次在 ScrollView 中实现 Lazy 堆栈时,我都会遇到这个问题:
LazyHStack到水平ScrollView或 aLazyVStack到垂直ScrollView场景 1 - 将滚动视图拉出边界(就像拉动以刷新)
预期行为:当滚动视图停留在您的手指下时,它的行为与预期一致
观察到的行为:它口吃和跳跃
场景 2 - 快速滚动到边缘,使其必须弹跳
预期行为:弹跳顺畅
观察到的行为:到达边缘时停止并抖动,但不反弹
我的理论 我的理论是,由于使用了 Lazy 堆栈,当视图离开屏幕时,它会从视图层次结构中移除,从而造成卡顿。
我想知道有没有其他人遇到过这种情况?这是 SwiftUI 中的错误吗?几个月来,我已经在不同的项目中可靠地重现了这一点,但最终还是不使用我希望可以使用的 Lazy 堆栈。
示例代码
ScrollView {
LazyVStack {
ForEach(viewModel.items) { items in
SomeView(viewModel: .init(context: viewModel.context, item: item))
}
}
Run Code Online (Sandbox Code Playgroud)
注意:口吃只发生在滚动视图的顶部
** 2021 年 7 月 10 日更新**
这仍然发生在 iOS 15 版本 13.0 测试版 (13A5155e) 中。
在下面的视频中,注意滚动条的行为和到达底部时的卡顿:
XCode 13.0 测试版 (13A5155e) 和针对 iOS 14 或 15
我的目标是在 SwiftUI 中创建一个聊天视图。这需要创建具有不同高度内容的 ScrollView。
经过大量调试后,我确定如果 ScrollView 中有没有固定高度的视图,当您滚动到视图顶部时它会卡顿。
——————
项目: 下载这个项目并自己尝试
struct Message: Identifiable {
let id = UUID()
var text: String
}
struct ContentView: View {
@State var items: [Message] = MockData.randomMessages(count: 100)
var body: some View {
VStack {
Button("Shuffle items") {
items = MockData.randomMessages(count: 100)
}
ScrollView {
LazyVStack(spacing: 10) {
ForEach(items) { item in
Text(item.text)
.background(colors.randomElement()!)
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在的结论是LazyVStack仅适用于具有固定高度的子视图。仅此问题就阻止了 SwiftUI 的生产就绪。
有没有其他人解决过这个问题? …