问题描述
XCode 版本 12.4 (12D4e)
我每次在 ScrollView 中实现 Lazy 堆栈时都会遇到这种情况:
场景 1 - 将滚动视图拉出边界(就像拉动以刷新)
预期行为:当滚动视图停留在您的手指之下时,它的行为与预期一致
观察到的行为:口吃和跳跃
场景 2 - 快速滚动到边缘,使其必须反弹
预期行为:弹跳顺畅
观察到的行为:到达边缘时停止并抖动,但不反弹
我的理论 我的理论是,由于使用了 Lazy 堆栈,当视图离开屏幕时,它会从视图层次结构中移除,从而造成卡顿。
我想知道有没有其他人遇到过这种情况?这是 SwiftUI 中的错误吗?几个月来,我已经在不同的项目中可靠地重现了这一点,但最终还是不使用我希望可以使用的 Lazy 堆栈。
示例代码
ScrollView {
Lazyvstack {
ForEach(viewmodel.items) { items in
SomeView(viewmodel: .init(context: viewmodel.context,item: item))
}
}
解决方法
我收到了 DTS 的回复,他们确认这是一个错误,但没有解决方法。您可以参考我的反馈 ID 并提交反馈项目。我想他们会用新的 swift 版本解决这个问题,因为我认为这可能是一个遗留缺陷,可能会导致重大更改。换句话说,它与原生组件和导航栏有关,他们必须打破一些东西才能修复它。这意味着 iOS 14 中的 SwiftUI 应用程序可能永远不兼容。但我只是推测。如果我有任何消息,我会通知所有人。这真的是一个主要的障碍,完全破坏了 IMO 的用户体验。
,我已确认该问题已在 iOS 15 中解决。不确定这是否有帮助,但也使用 Xcode 13 重新编译了应用程序。?
,我可以确认使用 Xcode 13 的 iOS 15 中仍然存在口吃问题。我不确定是什么导致了它,但这似乎与 LazyStacks 创建和布局项目的方式有关。
这是一个重现问题的 MWE:
ScrollView(.horizontal) {
LazyHStack {
Color.red.frame(width: 450)
Color.green.frame(width: 250)
Color.blue.frame(width: 250)
}
}
.frame(width: 350)
在这个例子中,红色的框架看起来“足够宽”,导致在屏幕前缘弹跳时出现卡顿。
稍微减少宽度使口吃消失:
ScrollView(.horizontal) {
LazyHStack {
Color.red.frame(width: 400)
Color.green.frame(width: 250)
Color.blue.frame(width: 250)
}
}
.frame(width: 350)
注意:在带有 Xcode 13 beta 1 和 iOS 15 beta 1 的 iPhone Xs Max 上进行测试。对于这个特定的例子,问题只发生在设备上(可能是因为我在模拟器上滚动速度不够快)。但是我在模拟器上的更复杂的视图上也遇到过这个问题。