31

XCode バージョン 12.4 (12D4e)

ScrollView 内に Lazy スタックを実装するたびに、これに遭遇しました。

  1. LazyHStackaを横に、ScrollViewまたは aLazyVStackを縦に追加するScrollView
  2. スクロール ビューのコンテンツ サイズがその境界を超えるように、十分なコンテンツを追加します。

シナリオ 1 - 境界を超えてスクロールビューをプルする (リフレッシュするためにプルしているように)

期待される動作: スクロール ビューが指の下にある場合は、期待どおりに動作します。

観察された行動: 吃音とジャンプ

シナリオ 2 - バウンドするように端まですばやくスクロールする

期待される動作: スムーズに跳ねる

観察された動作: 端に到達すると停止して揺れますが、跳ねません。

私の理論 私の理論では、Lazy スタックを使用しているため、ビューが画面から消えると、ビュー階層から削除され、スタッターが発生します。

他の誰かがこれに遭遇したのだろうか?これはSwiftUIのバグですか? 私はこれを数か月間、さまざまなプロジェクトで確実に再現してきましたが、できればLazyスタックを使用しないことに頼ることになりました。

サンプルコード

        ScrollView {
          LazyVStack {
            ForEach(viewModel.items) { items in
              SomeView(viewModel: .init(context: viewModel.context, item: item))
            }
          }

注: スタッターはスクロール ビューの上部でのみ発生します

** 2021 年 7 月 10 日更新**

これは、iOS 15、バージョン 13.0 ベータ版 (13A5155e) でも発生しています。

下のビデオでは、スクロールバーの動作と、一番下に到達したときのカクつきに注目してください。

https://youtu.be/z2pybl5yYqk

** 2021 年 7 月 19 日更新**

ビュー内のすべてを切り取って、1 つずつ元に戻しました — 単純な要素のVStack/HStack/ZStack周りに aを配置するとすぐに、LazyVStack が途切れ始めます。Text

要素に追加fixedSize(horizontal: false, vertical: true)すると、Text吃音が停止するようです。可変高さを追加するとすぐに、UIViewRepresentable再びスタッターし始めます。

LazyStack では、すべての子が何らかの固定サイズであるか、純粋な SwiftUI ビューである必要があるようです。

掘り続けます。解決しなければなりません...

4

5 に答える 5