SwiftUI:将 LazyVStack 或 LazyHStack 放入 ScrollView 会导致口吃Apple 错误??

问题描述

XCode 版本 12.4 (12D4e)

我每次在 ScrollView 中实现 Lazy 堆栈时都会遇到这种情况:

  1. 向水平 LazyHStack 添加 ScrollView 或向垂直 Lazyvstack 添加 ScrollView
  2. 添加足够的内容,使滚动视图的内容大小超出其边界

场景 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 上进行测试。对于这个特定的例子,问题只发生在设备上(可能是因为我在模拟器上滚动速度不够快)。但是我在模拟器上的更复杂的视图上也遇到过这个问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...