【发布时间】:2021-06-05 23:28:36
【问题描述】:
XCode 版本 12.4 (12D4e)
每次我在 ScrollView 中实现延迟堆栈时都会遇到这种情况:
- 将
LazyHStack添加到水平ScrollView或将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 日更新 **
我把视图中的所有内容都撕掉了,然后一个一个地建立起来——当我在一个简单的Text 元素周围放置一个VStack/HStack/ZStack 时,LazyVStack 就会开始卡顿。
如果我将fixedSize(horizontal: false, vertical: true) 添加到Text 元素,它似乎停止了口吃。只要我添加一个高度可变的UIViewRepresentable,它就会再次开始卡顿。
似乎在 LazyStack 中,每个孩子都需要某种固定大小或纯 SwiftUI 视图才能工作。
我会继续挖掘。必须...解决...
【问题讨论】:
-
你的理论是不正确的,一旦 Lazy Stack 加载了一个视图并且该视图不需要更新,它将保留在内存中,直到对该视图进行新的更新。
-
@swiftPunk 你能链接到任何文档吗?我没有说它是从内存中删除的,我推测它是在屏幕外时从视图层次结构中删除的
-
我可以确认我也遇到了这个问题。我在反馈中提交了问题,还提交了代码级支持票。有趣的是,我没有收到代码级支持票的回复,这是我以前从未遇到过的。这发生在应用程序的多个区域,因此这是一种糟糕的用户体验。如果我收到回复,我会在这里报告。这是我能够找到的第一篇带有重现步骤和结果的帖子。我将通过电子邮件向 Apple 发送有关代码级支持票的信息。我在上个月报告了这个 11 月、12 月 FB8899884、FB8941709 和 DTS 762092933(没有回复)。
-
我在 ScrollView 中遇到了与 LazyVStack 完全相同的问题。希望可以解决。你的帖子非常清楚地解释了这个问题,所以谢谢你。这与我切换到列表视图时得到的预期反弹行为非常不同。希望他们尽快为 LazyVStack/HStack 修复它
-
我现在正在努力解决这个错误。 @TomGODDARD 你有关于这些门票的任何消息吗?我还没有找到工作。
标签: ios swift xcode swiftui swiftui-scrollview