相关疑难解决方法(0)

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

XCode 版本 12.4 (12D4e)

每次在 ScrollView 中实现 Lazy 堆栈时,我都会遇到这个问题:

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

场景 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) 中。

在下面的视频中,注意滚动条的行为和到达底部时的卡顿:

https://youtu.be/z2pybl5yYqk …

xcode ios swift swiftui swiftui-scrollview

20
推荐指数
2
解决办法
1420
查看次数

ScrollView 内的 LazyVStack 中具有可变高度的内容会导致口吃/跳跃

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 的生产就绪。

有没有其他人解决过这个问题? …

uiscrollview ios swift swiftui

7
推荐指数
1
解决办法
248
查看次数

标签 统计

ios ×2

swift ×2

swiftui ×2

swiftui-scrollview ×1

uiscrollview ×1

xcode ×1