SwiftUIで観測されたオブジェクトの変更時にリストのアニメーションを無効にする方法は?


15

ビューモデルデータが変更されたときにアニメーションを無効にするにはどうすればよいですか?

私は次のコードを持っています:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}

ビューモデルの変更Listがアニメーションで更新されるたびに。
どうすれば無効にできますか?
追加してみました.animation(nil)が、役に立ちません

回答:


1

AppleがListでそれを行うように変更を加えるまでの回避策は、List.id(_ :)を呼び出すことです。これにより、Listの内部状態が変更され、アニメーションなしでListが即座に再作成されます。詳細については、リストの再読み込みアニメーションの不具合を参照してください。

同じことを任意のビューで行うことができます(func id()はビュープロトコルの一部です)が、すべての状態変数が初期の「デフォルト」状態になることを知っている必要があるため、慎重に使用してください。ビューの「再作成」と同じです。

どのように機能するかを理解するには、https://swiftui-lab.com/swiftui-id/を参照してください。


1

私が見つけた解決策は、毎回変化する一意の識別子を追加することです。そのため、アニメーションなしで毎回リストが再構築されます。iOS 13.4で検証済み。

var body: some View {
    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }
    }
    .id(UUID()) // no animation
}

-3
  1. を使用しない場合は、リスト内でForEachを使用する必要はありませんSection。だから代わりに:

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        })
    }

    次のコードで十分です。

    List(viewModel.options) { option in
        Text(option.displayValue)
    }

    また、ForEachを使用するといくつかの問題が発生する可能性があることを理解することをお勧めします。例:SwiftUI:ForEach + ContextMenuを使用することは可能ですか?

  2. のみForEach()またはList()+ のみを使用する場合.animation(nil)-問題を解決する必要があります。

    サンプル1:

    ForEach(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    サンプル2:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    macOS 10.15.2(19C57)でテスト済みですが、完全に動作します。

  3. また、あなたが使用することを試みることができる.animation(nil)ListForEachの両方。私は試しませんでした...しかし、これはあなたに必要な効果を与えると思います。

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }.animation(nil)
    }.animation(nil)

.animation(nil)残念ながら13.3には影響がないようです
Fabian Streitel '26

@FabianStreitel私はmacOS 10.15.2(19C57)でパート2をテストしましたが、完全に動作します。
Andrew

そして、私はiOS 13.3(上記の私のコメントで述べたように)で3つすべてのバリアントをテストしてきましたが、どれもリストの動作をまったく変更しません。OPはiOSアプリとmacOSアプリのどちらを作成しているかについては残念ながら述べていません。しかし、iOSで機能しないという情報は他​​の人にも関係があると思います。
Fabian Streitel

最近.animation(nil)、Xcode 11.4とiOS 13.4を使用してテストしましたが、これでうまくいきました。
Simen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.