XCode バージョン 12.4 (12D4e)
ScrollView 内に Lazy スタックを実装するたびに、これに遭遇しました。
LazyHStack
aを横に、ScrollView
または aLazyVStack
を縦に追加するScrollView
- スクロール ビューのコンテンツ サイズがその境界を超えるように、十分なコンテンツを追加します。
シナリオ 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) でも発生しています。
下のビデオでは、スクロールバーの動作と、一番下に到達したときのカクつきに注目してください。
** 2021 年 7 月 19 日更新**
ビュー内のすべてを切り取って、1 つずつ元に戻しました — 単純な要素のVStack/HStack/ZStack
周りに aを配置するとすぐに、LazyVStack が途切れ始めます。Text
要素に追加fixedSize(horizontal: false, vertical: true)
すると、Text
吃音が停止するようです。可変高さを追加するとすぐに、UIViewRepresentable
再びスタッターし始めます。
LazyStack では、すべての子が何らかの固定サイズであるか、純粋な SwiftUI ビューである必要があるようです。
掘り続けます。解決しなければなりません...