Bagaimana cara menonaktifkan animasi dalam daftar ketika perubahan objek yang diamati di SwiftUI?


15

Bagaimana cara menonaktifkan animasi saat melihat data model berubah?

Saya memiliki kode berikut:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

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

Setiap kali perubahan model tampilan Listdiperbarui dengan animasi.
Bagaimana saya bisa menonaktifkannya?
Saya mencoba menambahkan .animation(nil)tetapi tidak membantu

Jawaban:


1

Solusi hingga Apple memberi kami perubahan untuk melakukannya di Daftar adalah panggilan List.id (_ :) Ini mengubah keadaan internal Daftar dan memaksa Daftar untuk membuat ulang dengan segera, tanpa animasi apa pun. Untuk detailnya lihat Daftar memuat ulang gangguan animasi

Hal yang sama dapat dilakukan pada View apa saja (func id () adalah bagian dari protokol View), tetapi Anda harus tahu bahwa semua variabel state akan memiliki status "default" awal, jadi gunakan dengan hati-hati. Itu sama seperti "menciptakan" Lihat.

Untuk dapat memahami cara kerjanya, lihat https://swiftui-lab.com/swiftui-id/


1

Solusi yang saya temukan adalah menambahkan pengidentifikasi unik yang berubah setiap waktu, sehingga akan membangun kembali daftar setiap kali tanpa animasi. Terverifikasi di iOS 13.4.

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

-3
  1. Tidak perlu menggunakan ForEach di dalam Daftar jika Anda tidak menggunakan Section. Jadi alih-alih:

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

    Kode berikut cukup untuk menulis:

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

    Dan juga lebih baik untuk mengetahui bahwa penggunaan ForEach dapat menciptakan beberapa masalah, seperti contoh: SwiftUI: apakah mungkin menggunakan ForEach + ContextMenu?

  2. Jika Anda akan menggunakan hanya ForEach()atau hanya List()+ .animation(nil)- harus menyelesaikan masalah Anda:

    Sampel 1:

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

    Sampel 2:

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

    Saya telah diuji keduanya pada macOS 10.15.2 (19C57) dan berfungsi dengan baik.

  3. Anda juga dapat mencoba untuk digunakan .animation(nil)pada Listdan ForEachkedua. Saya tidak mencoba ... tapi saya pikir ini juga akan memberi Anda efek yang dibutuhkan.

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

.animation(nil)tampaknya tidak berpengaruh pada 13,3, sayangnya
Fabian Streitel

@FabianStreitel Saya telah menguji bagian 2 di macOS 10.15.2 (19C57) dan berfungsi dengan baik.
Andrew

Dan saya sudah menguji ketiga varian di iOS 13.3 (seperti yang dinyatakan dalam komentar saya di atas) dan tidak satupun dari mereka yang mengubah perilaku Daftar sama sekali. OP tidak menyatakan apakah mereka membuat aplikasi iOS atau macOS. Tapi saya pikir info yang tidak berfungsi di iOS juga relevan untuk orang lain.
Fabian Streitel

Saya baru-baru ini diuji .animation(nil)menggunakan Xcode 11.4 dengan iOS 13.4, dan itu berfungsi untuk saya.
Simen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.